如何使用backbone.js中的自定义选项处理递归模型更改事件?

时间:2014-02-18 21:10:57

标签: javascript backbone.js backbone-events backbone-collections backbone-model

我有一个集合,我正在收听所有模型更改事件。在一个特定的模型属性中,我需要在模型上设置一个额外的值,这会导致再次触发事件。我试图传递自定义选项,所以我可以忽略第二个调用。我不想使用{ silent: true },因为我需要用户界面进行更新。

问题是我的自定义选项正在通过。我发现原因是因为更改事件在当前模型的change事件中被触发,所以它只是在骨干代码中继续它,并且我的自定义选项没有被传入。

这就是我正在做的事情。这是粗略的代码,仅用于示例目的,而不是精确的。

var View = Backbone.View.extend({
    initialize: function(){
        this.collection = new Backbone.Collection();
        this.listenTo(this.collection, "change", this._modelChange);
    },

    _modelChange: function(model, options)
    {
        if(!_.has(model.changed, "IsSelected")){
            model.set({ Selected: true }, { modelChanging: true });
        }

        // Do some other things...
    }
});

这里发生的事情是我需要订阅发生的任何变更事件,并在事件发生时执行某些操作。有10多个属性,所以我不想列出所有属性。如果更改的属性不是IsSelected,我需要将其设置为true。这将导致change事件再次触发,并且将再次调用_modelChange方法。这是我期待{ modelChanging: true }选项可用的地方,但它不是。我发现这种情况正在发生,因为它在更改事件期间设置了模型的价值,因此骨干网将触发事件本身,骨干网不知道我传入的选项

这是我提出的一个解决方案,但我真的不喜欢它。

setTimeout(function(){
    model.set({ Selected: true }, { modelChanging: true });
}, 0);

这将以异步方式运行,因此它将不再是同一事件的一部分。我真的不喜欢这样,感觉就像是一个大黑客。

如何在没有setTimeout的情况下完成此操作?

0 个答案:

没有答案