【问题标题】:In Backbone, can I add model behavior to a collection?在 Backbone 中,我可以将模型行为添加到集合中吗?
【发布时间】:2012-11-14 18:49:18
【问题描述】:

如果我有一个对象集合,但还想存储有关这些对象的一些更高级别的信息,是否适合向集合中添加一些模型行为?

在我的情况下,我正在寻找一组应用程序路径来拥有一个名为“curPath”的布尔字段。如果已更改,则该集合应设置一个指示当前页面的标志。这样外部观察者只需要观察一个字段,而不是路径集合中的每个模型。

这可能是这样的:

var PathModel = Backbone.Model.extend({})
var PathCollection = Backbone.Collection.extend({
  initialize: function(){ this.model = PathModel }
})
// I want to be able to set observable properties on the collection, so...
var PathManager = _.extend(Backbone.Model, PathCollection)

// Then maybe I can do something like this?
PathManager.each(function(pathModel){
  pathModel.on('change:curPath', function(m, value, o){
    // I mean for 'this'.set to point to the instance of the PathManager
    if (value === true){ this.set('curPath', pathModel.get('id')) } 
  }, this)
}, this)

是否适合将可观察行为添加到集合(集合+模型>模型),还是需要将包装模型添加到整个事物(模型>集合>模型),还是有其他解决方案?

【问题讨论】:

    标签: javascript architecture backbone.js publish-subscribe


    【解决方案1】:

    由于 Model 和 Collection 上的某些方法具有相同的名称,这会导致冲突,并且可能会在更新到 Backbone 的未来版本时出现问题,我建议不要使用这种模式。而不是这样做创建一个 PathManager 类并初始化 PathCollection 并将其设置为此模型上的路径属性。如果从你所说的

    var PathManager = Backbone.Model.extend({
        initialize: function() {
            this.paths = new PathCollection();
        }
    });
    
    var pathManager = new PathManager();
    
    pathManager.paths.add({ /* new path */ });
    pathManager.on('change', doSomething);
    pathManager.paths.on('add', doSomethingElse);
    

    我会这样做

    【讨论】:

    • PathManager 是一个模型。 “路径”是否应该是您通过 get/set 方法访问/设置的属性,而不是对象本身的属性?或者他们已经(骨干无能)?并不是说我理解的任何一种方式都有任何优势(例如,如果它是一个 get/set 属性,我认为不会触发更改事件)。我只是想弄清楚什么是正常做法?
    • 我建议不要将其作为模型属性,而是将其保留为示例中所示的属性。如果您想将集合/模型嵌套为属性,我建议您阅读更多关于骨干的关系插件以确保正确同步等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2012-07-19
    • 2022-06-16
    • 2012-09-21
    相关资源
    最近更新 更多