Backbone.js 我如何利用木偶在一个孩子';s的模型被破坏了?
我原以为木偶可以自动删除被破坏模型的视图,但在我的情况下它不起作用。我有一个显示电影集的合成视图。每部电影都有演员名单。当我单击“删除电影”时,它应该删除所有相关的演员,并使用已删除的特定电影更新视图。目前,我的应用程序会销毁模型,但视图不会更新。如果我刷新页面,电影和相关演员就会消失,因此我知道它正在破坏模型,而不是点击时的视图。我怎样才能让木偶来处理这件事 相关控制器代码:Backbone.js 我如何利用木偶在一个孩子';s的模型被破坏了?,backbone.js,marionette,Backbone.js,Marionette,我原以为木偶可以自动删除被破坏模型的视图,但在我的情况下它不起作用。我有一个显示电影集的合成视图。每部电影都有演员名单。当我单击“删除电影”时,它应该删除所有相关的演员,并使用已删除的特定电影更新视图。目前,我的应用程序会销毁模型,但视图不会更新。如果我刷新页面,电影和相关演员就会消失,因此我知道它正在破坏模型,而不是点击时的视图。我怎样才能让木偶来处理这件事 相关控制器代码: /* in my list_controller.js */ MovieApp.module("ActorsAp
/* 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.");
}
});
我不完全了解您试图实现的目标,但是,如果您想在销毁模型后更新视图,请尝试以下方法:
recipesListView.on("itemview:movie:delete", function(childView){
// This removes a model from the recipesListView collection
this.collection.remove(childView.model);
});
这假设您的recipesListView是一个集合,或者是一个compositeView。
同时检查:
我还创建了一个提琴来演示如何使用compositeView并通过事件删除项目:
如果上述方法对您没有帮助,您能解释一下:-在list.view中,this.model.actors的
是什么?
-视图的结构如何(视图类型的嵌套)
-您的数据在模型和集合中是如何定义的?谢谢您,Wilbert。这无疑是更新视图的有效方法,但当我重新加载页面时,删除的项目会返回。我把你的台词添加到我拥有的台词中,它现在似乎起作用了,实际上破坏了模型,但我不确定这是否是正确的方法。childView.children.each(函数(child){child.model.destroy();});我已经更新了原始问题以包含我的控制器代码。我还在学习,所以我想我可能没有正确处理好这些关系。演员模型存储一个电影ID以将他们拉入列表。这可以做得更干净,所以我愿意接受建议。为了回答您关于this.model.actors的问题,我正在尝试将关联的演员存储在电影模型中。这似乎不是正确的方法,但现在一切似乎都在运行我只是希望我知道正确的方法。基本上你要做的是定义模型之间的关系。看看这个:谢谢,这就是我要找的!我想我会处理好我需要的一切。我将把这标记为已接受的答案。