2016-12-21 12 views
0
 var ContactManager = new Marionette.Application(); 

     ContactManager.addRegions({ 
      mainRegion: "#main-region", 
      child:"#child2" 
     }); 

     Ar = Backbone.Model.extend({}); 
     Se = Backbone.Model.extend({}); 
     Articlescollection = new Ar({ product_id: "104", title: "Test title"}); 
     SelectedsCollection = new Se({ product_id: "71", title: "Test title"}); 


     ContactManager.StaticView = Marionette.ItemView.extend({ 
      template: tpl2, 
      tagName: "div", 
      model:Articlescollection, 
      modelEvents: { 
       'change': 'fieldsChanged' 
      }, 
      fieldsChanged:function(){ 
       console.log('dddd') 
      }, 

      initialize: function() { 
       this.model.on('change', this.render); 
      } 
     }); 


     ContactManager.StaticView2 = Marionette.ItemView.extend({ 
      template: tpl2, 
      tagName: "div", 
      model:SelectedsCollection 
     }); 


     var MyLayout = Backbone.Marionette.LayoutView.extend({ 
      template: tpl3, 

      regions: { 
       menu: "#menu", 
       content: "#content" 
      } 
     }); 

     ContactManager.on("start", function() { 



      // ContactManager.mainRegion.show( new MyLayout ) 

      var layout = new MyLayout 
      ContactManager.mainRegion.show( layout) 
      layout.menu.show(new ContactManager.StaticView()); 
      layout.content.show(new ContactManager.StaticView2()) 

      Articlescollection.set("product_id", 24) 
//init fieldsChanged trigger for change model 
     }) 

     ContactManager.start(); 

modelEventsとthis.model.onの違いは何ですか?未定義どのような違いがありますかmodelEventsとthis.model.on

答えて

1
の 'スプリット' プロパティを読み取ることができません:{ '変更':this.render }、

スロー例外キャッチされない例外TypeErrorモデルは変更はなく

modelEventsたとき

は、彼らの両方がinitizlized

modelEventsthis.listenTo(this.model, { 'change': 'fieldsChanged' });と同じです。それはちょうど砂糖ですので、それをinitializeに追加する必要はありません。あなたはおそらくthis.model.onビューの中で使用する必要があります。それは自動的にthis.listenToのようにクリーンアップされません。 this.on以外の場合は、listenToがより安全であるため、onを一般的に使用する必要はありません。 renderが強制的にマリオネットによってビューにバインドされているため、これはrenderに働くだろう

var model = this.model; 
var view = this; 
this.model.on('change', function() { 
    this === model; // true 
    this === view; //false 
}); 

唯一の理由は次のとおりです。

ここで他の主要な違い

は、ということです。他の関数は、異なるスコープを持ちます。あなたは modelEventsから renderを呼び出したい場合は、いくつかのオプションを持っているあなたは onの第三変数として渡すことにより、スコープを変更することができますが、再び、あなたは onBeforeDestroy

this.model.offする必要があります。

modelEvents: { 
    'change': 'render' 
} 
//or 
modelEvents: function() { 
    return { 
    'change': this.render 
    }; 
} 
// or 
modelEvents: { 
    'change': function() { this.render(); } 
} 
関連する問題