【问题标题】:How to prevent models added to a collection in BackboneJS from fetching their data once added to collection如何防止添加到 Backbone JS 中的集合的模型在添加到集合后获取数据
【发布时间】:2014-09-09 17:24:25
【问题描述】:

当我启动我的 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 应用程序中查看单个用户时。当我尝试查看用户列表时,我只是不希望它这样做。

【问题讨论】:

  • 如果你只想获取一个用户模型,那么不要在模型初始化中再次获取它
  • 当我初始化一个 UserView 时,我希望连接到该 (UserModel) 的模型从 API 获取数据。但是,当我初始化 UserListView 并将一个新的 UserList(它是一个集合)传递给它时,我会在对 API 的一个 GET 请求中获取要添加到集合中的所有模型数据。但是随后该集合显然在它创建并添加到自身的每个模型上运行 .initialize() ,这会在每个模型上触发另一个 .fetch() ,这是我不想要的。如果列表包含 10 个模型,则意味着应用程序执行了 11 个 API 调用。这是我不想要的。
  • 您的数据已经存在于集合中,因此您不需要再次获取它,从集合中获取模型并将其分配给视图
  • 我删除了模型的 .initialize() 中的 .fetch(),而是在我初始化了一个传递了 id 的 UserView 之后添加了一个 .fetch()。 --- that.view = new UserView({ model: new UserModel({ id: id }) }); --- that.view.model.fetch(); --- 看起来很丑。必须以其他方式解决此问题。
  • 如果您已经为您的收藏品提取了它,为什么还需要再次提取它仍然不清楚。

标签: javascript backbone.js view collections model


【解决方案1】:

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

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

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

【讨论】:

  • 在这个特定的用例中,你的技巧会奏效。但这与我在上面的 cmets 中的“解决方案”一样多是“黑客”。
  • 是的,我知道这是一种“黑客”,因为您尝试做的是错误的方式。正确的方法就是你所说的丑陋的方法:)但这是对错误方法问题的正确答案;)
【解决方案2】:

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

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

如果您已经提取了您的收藏,那么收藏长度大概为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多