0

這是我的第一篇文章,所以請很好;)我試圖創建一個Backbone + requireJS示例應用程序,我偶然發現了一個奇怪的問題。在我的視圖初始化函數中,我綁定到模型更改事件Backbone.js模型觸發器更改只有model.on再次調用

this.model.on("change", this.change()); 

當數據加載並且一切正常時,會正確觸發事件。在我看來,我也綁定到一個點擊事件。單擊我嘗試更改其中一個屬性,我希望發生更改事件,但它從未出現過。

我正在嘗試一些東西推薦這裏在stackoverflow(herehere, and there),但沒有運氣。

在我的內心裏,我覺得它與事件綁定有關。當我試圖再次綁定到更改事件模型內點擊回調它開始工作。所以現在我坐在這裏,我很困惑。有人能解釋這個問題嗎?

筆者認爲:

define(
[ 
    'jquery', 
    'underscore', 
    'backbone', 
    'text!templates/news/newsListItem.html' 
], 
function($, _, Backbone, newsListItemTemplate) 
{ 
    var NewsListItemViewModel = Backbone.View.extend({ 
     tagName: 'li', 
     events: { 
      "click a" : "onLinkClick" 
     }, 
     initialize: function(){ 
      this.model.on("change", this.changed()); 
     }, 
     render: function() 
     { 
      this.$el.html(_.template(newsListItemTemplate, this.model.toJSON())); 
     }, 
     changed: function() 
     { 
      this.render(); 
      console.log("changed"); 
     }, 
     //GUI functions 
     onLinkClick: function(e) 
     { 
      console.log("click!"); 
      this.model.toggle(); 
      this.model.on("change", this.changed()); 

     } 

    }); 

    var init = function(config){ 
     return new NewsListItemViewModel(config); 
    } 

    return { 
     init : init 
    } 
} 

);

我的模型:

define(
['jquery', 'underscore', 'backbone'], 
function($, _, Backbone){ 

    var NewsListItemModel = Backbone.Model.extend({ 
     toggle: function() { 
      this.set('done', !this.get('done')); 
      this.trigger('change', this); 
     } 
    }); 

    var init = function(data) 
    { 
     return new NewsListItemModel(data); 
    } 

    return { 
     init: init, 
     getClass: NewsListItemModel 
    }; 
} 

);

感謝任何輸入:)

回答

0

首先,你應該使用功能作爲事件處理程序 - 而不是它的結果。 因此,改變行成這樣:

this.model.on("change", this.changed.bind(this)); 

目前的情況是,你居然火this.changed()功能只有一次 - 並分配結果(這是undefined,因爲功能沒有return聲明)是該模型的change事件處理程序。

其次,你不應該在onLinkClick重新綁定這個處理程序:一旦綁定,它就會留在這裏。它看起來更適合trigger此事件代替:

onLinkClick: function(e) 
{ 
    console.log("click!"); 
    this.$el.toggle(); 
    this.model.trigger('change'); 
} 
+0

感謝隊友,它的工作! onLinkClick下的代碼包含我的調試代碼,重新綁定只是一個檢查重新綁定是否工作的測試。我也一直在尋找[todos](http://backbonejs.org/docs/todos.html),並且它們在init中作爲休閒版本綁定在一起: this.listenTo(this.model,'change',this。渲染); 它是推薦的方式綁定到模型? – user3485150

相關問題