2013-03-27 97 views
1

我有一個名爲layerPanel的視圖,該視圖使用screenData模型。現在在model.set上,我從模型本身獲取更新事件,但它不能處理視圖。在骨幹js中更新模型時,更改事件不會觸發

模型

var screenData = Backbone.Model.extend({ 


initialize : function() { 
    _.bindAll(this,"update"); 
    this.bind('change:vdata', this.update); 
}, 

update: function() { 
var obj = this.vdata; 
    alert("update"); 
}, 

vdata:[{id : 0, title : "Welcome to Persieve 0"}] 

}); 

VIEW

var layerPanel = Backbone.View.extend({ 

      el: "#allLayers", 
      model: new screenData(), 


      initialize: function() { 
       this.render(); 
      this.model.bind('change:vdata', this.render); 
      }, 
    render: function() { 
       this.template = _.template(LayersTpl, {splitData: this.model.vdata}); 
       this.$el.html(this.template); 
       return this; 
      } 
     }); 

下面是我在模型中設置的值。

screendata = new screenData; 
    var obj = screendata.vdata; 
    obj[obj.length] = {id : $(".bullet").length, title : "Welcome to Persieve"}; 
    var tempData = []; 
    for (var index=0; index<obj.length; index++) { 
    if (obj[index]) { 
     tempData.push(obj); 
    } 
    } 
    obj = tempData; 
    screendata.set({vdata:[obj]}); 
+0

你能展示更多你的價值設置代碼嗎?您是否將layerPanel的模型設置爲您在最後一個代碼段的第一行中創建的新模型? – 2013-03-27 12:03:56

+0

Matt,我已經添加了在Model中設置值的代碼。 – 2013-03-27 14:13:06

回答

4

事件發生。但是你的渲染不會像'this'上下文需要設置那樣工作。

嘗試:

this.model.bind('change:vdata', this.render, this); 

,甚至更好,使用listenTo和上下文是隱含的(+可以清理容易this.remove())

編輯。從上面所做的編輯中,我可以看到您正在創建新的screendata實例。您創建的綁定是針對不同的實例model: new screenData()

如果您希望事件觸發,則必須引用綁定的對象並進行設置。

如果所有模型設置都發生在實際模型中。致電this.set({vdata:[obj]});

+0

這也不起作用。我試過聽,仍然沒有運氣。事實上,我發現事件本身並沒有觸發。我放了另一個函數而不是渲染,但它也沒有調用。 – 2013-03-27 14:15:48

+0

我編輯了我的回覆。 – 2013-03-27 14:20:39

+0

我爲模型創建了全局對象並進行了修改,現在工作正常,thx。 – 2013-03-28 05:15:35