Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当再次调用model.on时,Backbone.js model才会触发更改_Backbone.js_Requirejs_Backbone Views_Backbone Events_Backbone Model - Fatal编程技术网

仅当再次调用model.on时,Backbone.js model才会触发更改

仅当再次调用model.on时,Backbone.js model才会触发更改,backbone.js,requirejs,backbone-views,backbone-events,backbone-model,Backbone.js,Requirejs,Backbone Views,Backbone Events,Backbone Model,这是我在这里的第一篇帖子,所以请友好一点;)我正在尝试创建一个主干+requireJS示例应用程序,我遇到了一个奇怪的问题。在我的视图初始化函数中,我通过事件绑定到模型更改 this.model.on("change", this.change()); 事件在加载数据且一切正常时正确触发。在我看来,我还绑定到一个click事件。点击我试图改变其中一个属性,我希望有一个改变事件,但它从来没有来过 我在stackoverflow(,)上尝试了一些推荐的东西,但是运气不好 在我的内心深处,我觉得这与

这是我在这里的第一篇帖子,所以请友好一点;)我正在尝试创建一个主干+requireJS示例应用程序,我遇到了一个奇怪的问题。在我的视图初始化函数中,我通过事件绑定到模型更改

this.model.on("change", this.change());
事件在加载数据且一切正常时正确触发。在我看来,我还绑定到一个click事件。点击我试图改变其中一个属性,我希望有一个改变事件,但它从来没有来过

我在stackoverflow(,)上尝试了一些推荐的东西,但是运气不好

在我的内心深处,我觉得这与事件绑定有关。当我再次尝试在单击回调时绑定到更改事件中的模型时,它开始工作。所以现在我坐在这里,嗯,我很困惑。有人能解释一下这个问题吗

我的看法是:

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
    };
}
))

感谢您的输入:)

首先,您应该将函数用作事件处理程序,而不是其结果。 因此,将该行更改为:

this.model.on("change", this.changed.bind(this));
现在,实际上只需启动一次
this.changed()
函数,并将其结果(未定义的
return
,因为该函数没有
return
语句)指定为模型的
change
事件处理程序

其次,您不应该在
onLinkClick
中重新绑定此处理程序:一旦绑定,它将留在这里。看起来更适合
触发此事件:

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

谢谢,伙计,成功了!onLinkClick下的代码包含我的调试代码,重新绑定只是检查重新绑定是否有效的测试。我现在也一直在看,它们在init中绑定为fallows:this.listenTo(this.model,'change',this.render);这是绑定到模型的推荐方法吗?