如何防止添加到BackboneJS中的集合的模型在添加到集合后获取其数据

时间:2014-09-09 17:24:26

标签: javascript backbone.js view collections model

当我启动UserList(集合)时,我从我的API中获取所有用户(模型)。

接下来发生的是我想要阻止的事情。

然后集合似乎初始化每个模型,为每个模型触发模型的.fetch()。

为什么会发生这种情况,我不知道。我所做的只是从我的集合中调用.fetch()。

以下代码:

var UserList = Backbone.Collection.extend({
    model: UserModel,
    url: 'api/user',

    initialize: function() {
        this.fetch();
    }
});

var UserModel = Backbone.Model.extend({
    urlRoot: 'api/user',

    defaults: {
        username: '',
        first_name: '',
        last_name: ''
    },

    initialize: function() {
        if(this.id) {
            this.fetch();
        }
    }
});

如何第二次阻止.fetch()新添加的模型?我已经从初始化集合时第一个.fetch()获得了所需的所有数据。

我仍然希望UserModel默认情况下在.initialize()上使用.fetch(),因为当我尝试在Web应用中查看单个用户时。当我试图查看用户列表时,我只是不想让它这样做。

2 个答案:

答案 0 :(得分:0)

一个技巧是测试Model.initialize函数是否获取属性作为这样的参数:

var UserModel = Backbone.Model.extend({
    ...
    initialize: function(attributes) {
        if(Object.keys(attributes).length < 2) {
            this.fetch();
        }
    }
    ...

因为当集合想要使用它获取的数据填充模型时,它会使用必须在此模型中设置的数据调用模型构造函数,并且这些数据将作为initialize函数的参数传播/ p>

答案 1 :(得分:0)

一个选项,如果您只想在尚未提取集合时获取模型,则在获取模型初始化之前检查集合长度:

if (this.collection.length === 0) {
    this.fetch();
}

如果你已经提取了你的收藏品,那么收集的长度可能是0。