2014-04-21 20 views
1

我以爲木偶將自動處理消除模型的視圖,但它不適用於我的情況。我有一個顯示電影集合的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."); 
    } 

    }); 

回答

1

我並不完全明白你想要達到的,但是如果要更新的意見在銷燬模型後試試這個:

recipesListView.on("itemview:movie:delete", function(childView){ 
    // This removes a model from the recipesListView collection 
    this.collection.remove(childView.model); 
}); 

這假設你的recipesListView是一個集合或一個co mpositeView。 同時檢查:http://lostechies.com/derickbailey/2012/04/05/composite-views-tree-structures-tables-and-more/

我還創建了一個小提琴使用CompositeView中刪除,並通過各種活動項目展示:http://jsfiddle.net/Cardiff/JEx6Y/

如果上述方法不幫助你,你能解釋一下:
- 在list.view,什麼是this.model.actors
- 您的視圖結構如何(視圖類型嵌套)
- 在模型和集合中如何定義數據?

+0

謝謝,威爾伯特。這絕對是更新視圖的工作,但當我重新加載頁面時,刪除的項目會返回。我將你的產品線添加到了我的產品中,現在它似乎能夠正常工作,並且實際上銷燬了這些模型,但我不確定這是否是正確的方式。 childView.children.each(function(child){ child.model.destroy(); }); – rfmerrill

+0

我已經更新了原始問題以包含我的控制器代碼。我仍然在學習,所以我認爲我可能無法正確處理關係。 Actor模型存儲movieId以將它們拖入列表中。這可以做得更乾淨,所以我願意接受建議。要回答關於this.model.actors的問題,我試圖將相關的演員存儲在電影模型中。這似乎並不是正確的方式,但一切似乎都奏效了,我只希望我知道正確的方式來做到這一點。 – rfmerrill

+0

基本上你想要做的是定義模型之間的關係。看看這個:http://backbonerelational.org/ –

相關問題