在集合上设置属性- backbone js

t9aqgxwy  于 2022-11-10  发布在  其他
关注(0)|答案(5)|浏览(213)

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

yvfmudvl

yvfmudvl1#

只是.extend集合具有 meta数据存储功能。

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

可能有更好的地方来存储“特定” meta数据,但这完全取决于元数据是什么。
用于存储泛型 meta数据的扩展集合构造函数用一个方法来做处理,应该行得通。
要注意,如果需要存储这些 meta数据并从服务器加载,那么您手头上的任务就更大了。

rjjhvcjd

rjjhvcjd2#

最好完全按照预期的方式使用Collection:(朱利安已经在OP上评论过了,我想给予一下为什么我认为他是对的)
假设您正在考虑一个Book(model)的Library(collection),就像在Backbone的文档示例中一样。您已经获得了关于您想要存储的库的 meta信息,比如这个图书库所在的地址,这是有意义的。
诀窍是不要把它看作 meta信息,你有一个图书馆,它有很多属性,其中之一就是它的藏书。

var Book = Backbone.Model.extend({ 
    title: "Moby Dick"
});

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

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

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

lvmkulzt

lvmkulzt3#

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

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

    // ...

});
s1ag04yj

s1ag04yj4#

使用@Raynos解决方案的meta函数时,只有一个参数,我无法使用。因此,我使用了以下代码:

var MyCollection = Backbone.Collection.extend({
    initialize: function() {
        this._meta = {};
    },
    put: function(prop, value) {
        this._meta[prop] = value;
    },
    get: function(prop) {
        return this._meta[prop];
    }
});

var collection = new MyCollection();
collection.put("someProperty", 12);
alert(collection.get("someProperty"));

希望能帮上忙。

q3aa0525

q3aa05255#

我已经阅读了其他的答案和评论,虽然我很欣赏将集合 Package 在模型中可能是绝对最干净的方式的想法,但我发现它在99.9%的时间里绝对是矫枉过正的。

const FooCollection = Backbone.Collection.extend({
    initialize: function(models, attributes) {
        attributes.log && console.log('foo!');  // Or set attributes on 'this', etc
    }
});

// Passing null for first arg, which is optionally an array of models
// to initialize the collection with
const fooCollection = new FooCollection(null, { log: true } );

多年来一直这样做,从来没有遇到过任何问题/缺点。

相关问题