我以爲木偶將自動處理消除模型的視圖,但它不適用於我的情況。我有一個顯示電影集合的CompositeView。每部電影都有一個演員名單。當我點擊「刪除電影」時,它應該刪除所有關聯的演員,並使用刪除的特定電影更新視圖。目前,我的應用程序破壞了模型,但視圖沒有更新。如果我刷新頁面,電影和相關演員都不見了,所以我知道它正在摧毀模型,而不是點擊時的視圖。我怎樣才能讓木偶處理這件事?在孩子的模型被銷燬之後,我如何利用Marionette重新渲染嵌套CompositeView?
相關的控制器代碼:
/* in my list_controller.js */
MovieApp.module("ActorsApp.List", function(List, MovieApp, Backbone, Marionette, $, _){
List.Controller = {
listActors: function(){
var actors = MovieApp.request("actor:entities");
var movies = new Backbone.Collection;
var allMovies= MovieApp.request("movie:entities");
actors.each(function(actor) {
movieId = actor.get("movieId");
if (!movies.get(movieId)){
//console.log("Movie not found. Adding to list list.");
movie = allMovies.get(movieId);
selectedActors = actors.where({ movieId: movieId });
//console.log("Selected Actors: ", selectedActors);
movie.actors=selectedActors;
movies.add(allMovies.get(movieId));
}
else {
console.log("Movie found in list. Skipping.")
}
});
var moviesListView = new List.Movies({
collection: movies
});
moviesListView.on("itemview:actor:new", function(childView, model){
MovieApp.ActorsApp.New.Controller.newActor(model);
});
moviesListView.on("itemview:itemview:actor:show", function(childView, model){
MovieApp.ActorsApp.Show.Controller.showActor(model);
});
moviesListView.on("itemview:movie:show", function(childView, model){
MovieApp.MoviesApp.Show.Controller.showMovie(model);
});
moviesListView.on("itemview:movie:delete", function(childView, model){
childView.children.each(function(child){
child.model.destroy();
});
// This removes a model from the moviesListView collection
this.collection.remove(childView.model);
this.render();
});
moviesListView.on("itemview:itemview:actor:delete", function(childView, model){
model.model.destroy();
});
moviesListView.on("movie:list", function(){
MovieApp.MoviesApp.List.Controller.listMovies();
});
MovieApp.mainRegion.show(moviesListView);
}
}
});
這裏是我的視圖代碼:
List.Movie = Marionette.CompositeView.extend({
tagName: "li",
template: "#actor-movie-list-item",
itemView: List.Actor,
initialize: function(){
console.log("Actors: ", this.model.actors);
actors = this.model.actors;
this.collection = actors;
this.collection = new Backbone.Collection(actors);
},
events: {
"click a.js-remove-movie" : "deleteClicked"
},
deleteClicked: function(e){
e.preventDefault();
e.stopPropagation();
this.trigger("movie:delete", this.model);
},
appendHtml: function(collectionView, itemView, index){
var container;
container = this.$('.recipe-list');
container.append(itemView.el);
},
onRender: function() {
if(_.isUndefined(this.collection)){
this.$("ul:first").remove();
}
console.log("Movie render called.");
}
});
謝謝,威爾伯特。這絕對是更新視圖的工作,但當我重新加載頁面時,刪除的項目會返回。我將你的產品線添加到了我的產品中,現在它似乎能夠正常工作,並且實際上銷燬了這些模型,但我不確定這是否是正確的方式。 childView.children.each(function(child){ child.model.destroy(); }); – rfmerrill
我已經更新了原始問題以包含我的控制器代碼。我仍然在學習,所以我認爲我可能無法正確處理關係。 Actor模型存儲movieId以將它們拖入列表中。這可以做得更乾淨,所以我願意接受建議。要回答關於this.model.actors的問題,我試圖將相關的演員存儲在電影模型中。這似乎並不是正確的方式,但一切似乎都奏效了,我只希望我知道正確的方式來做到這一點。 – rfmerrill
基本上你想要做的是定義模型之間的關係。看看這個:http://backbonerelational.org/ –