首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在集合主干js上设置属性

在集合主干js上设置属性
EN

Stack Overflow用户
提问于 2011-05-09 06:01:36
回答 5查看 28.6K关注 0票数 56

backbone js中的集合不允许set属性,但我经常发现需要存储一些关于集合的元信息。设置该信息的最佳位置在哪里?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-09-19 15:09:47

最好是完全按照预期的方式使用Collection :作为模型的捆绑包。(Julien已经在OP上评论了这一点,我想解释一下为什么我认为他是对的)

假设您正在考虑Backbone的文档示例中的Library (集合) of Book (模型)。这是有意义的,你已经获得了关于你想要存储的图书馆的元信息,比如这本书图书馆所在的地址。

诀窍是不要把它看作是元信息。你有一个有很多属性的图书馆,其中一个属性就是它的藏书。

代码语言:javascript
复制
var Book = Backbone.Model.extend({ 
    title: "Moby Dick"
});

var Collection = Backbone.Collection.extend({
    model: Book
});

var Library = {
    address: '45th Street',
    collection: Collection
};

在本例中,我将库定义为一个普通的JavaScript对象。显然,你也可以让Library成为一个模型,这样它就拥有了所有的主干功能。我在这里的观点是,您需要以一种更现实的方式来表示现实,退后一步,并看到您想要分配给Collection的额外属性实际上是上一级对象的兄弟属性:在本例中是Library。

票数 17
EN

Stack Overflow用户

发布于 2011-05-09 06:34:21

只需使用元数据存储功能.extend集合即可。

代码语言:javascript
复制
var MyCollection = Backbone.Collection.extend({
    initialize: function() {
        ...

        this._meta = {};
    },
    model: ...
    meta: function(prop, value) {
        if (value === undefined) {
            return this._meta[prop]
        } else {
            this._meta[prop] = value;
        }
    },
});

var collection = new MyCollection();
collection.add(someModels);
collection.meta("someProperty", value);

...

var value = collection.meta("someProperty");

可能有更好的地方来存储特定的元数据,但这完全取决于元数据是什么。

为了存储泛型元数据,用一个方法来扩展你的集合构造函数,这应该是可行的。

请注意,如果需要从服务器存储和加载这些元数据,那么您手头就有一个更大的任务。

票数 44
EN

Stack Overflow用户

发布于 2012-05-13 02:55:20

我升级了Raynos的事件触发方法,这样我们就可以绑定到集合的属性更新。

代码语言:javascript
复制
cls.groups = Backbone.Collection.extend({

    // ...

    // Reference to this collection's model.
    model: cls.group,

    initialize: function() {
        this._attributes = {}
    },

    // Extend collection with ability to store attributes and trigger events on attributes changing
    attr: function(prop, value) {
        if (value === undefined) {
            return this._attributes[prop]
        } else {
            this._attributes[prop] = value;
            this.trigger('change:' + prop, value);
        }
    },

    // ...

});


cls.group = Backbone.View.extend({

    // ...

    initialize: function() {

        // Catching attribute update
        app.groups.on('change:selected', function(value) {
            // ...
        }, this);
    },

    // ...

    events: {
        'click' : function(e) {
            // Set collection meta attribute on model's view click event
            app.groups.attr('selected', this.model.cid);
        }
    }

    // ...

});
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5930656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档