【问题标题】:Fetch a backbone collection with only the models with specified value获取仅包含具有指定值的模型的主干集合
【发布时间】:2016-07-30 02:03:33
【问题描述】:

我有一本 {name: value} 类型的字典

A = {
  name: x,
  name: y,
  name: z
}

我想获取一个集合(由具有其中一个属性为“名称”的模型组成),但为了达到最佳效果,我想获取这样属性“名称”的值存在于我的字典中。

有没有办法像这样进行特定的过滤?

【问题讨论】:

  • 你能发布你的尝试吗?
  • 你想过滤一个集合还是你想获取它(即从服务器)?
  • @JeppeStougaard 我想部分获取集合,而不是先(完全)获取它,然后过滤与我的字典匹配的模型
  • @VahanVardanyan - 我已经完全提取了集合,然后重载了过滤器方法以在我的字典“A”中返回匹配“名称”属性的模型。但我想知道是否有更好的解决方案首先部分获取集合。
  • @adelphia 这本词典在客户端、服务器或两者上都可用吗?根据这一点,您可以过滤客户端中的集合,也可以编写一个返回过滤模型的服务并创建一个指向该服务的集合。第一个将增加客户端所需的处理,第二个可能会增加 API 调用的数量...取决于您的应用程序的性质来决定如何处理它...

标签: backbone.js collections models


【解决方案1】:

如果您在客户端进行过滤,则覆盖过滤器方法确实不是要走的路。
现在您不再拥有它,如果您以后需要它。此外,从过滤器方法中修改集合本身是一种不良副作用。

相反,您应该使用parse method,它会在获取集合时自动调用。

现在据我了解,您希望将获取的集合限制为名称与字典中的键匹配的模型。

如果是这样,我会这样做:

parse: function(response, options) {
    // Do we want to filter the response?
    if (options.filterNames) {
        // Filter
        response = _.filter(response, function(obj) {
            // Check if this model name is one of the allowed names
            return _.contains(options.filterNames, obj.name);
        });
    }

    // Backbone will use the return value to create the collection
    return response;
}

然后调用 fetch 使用

someCollection.fetch({filterNames: _.keys(someDictionary)});

如果您确定,您将始终在获取时过滤集合,您可以省略传递该选项而只在解析中使用字典。

或者,您可以在集合上创建一个 fetchFiltered() 方法,然后调用上面的行。

【讨论】:

    【解决方案2】:

    经过调查和试验,可以通过以下两种方式解决此问题: 1. 从服务器获取集合后的客户端过滤。这是一种不太理想的方法,尤其是当集合很大时。如果您真的想要 1000 个模型集合中的 5 个模型,这可能是矫枉过正。但是如果服务器端没有接受和使用过滤的逻辑,客户端过滤应该是这样的:

    重载集合过滤器代码如下:

    var filter = {
        filter: function() {
            var results = _.filter(this.models, function(model) {
                // Perform the check on this model, like compare it to your local dict
                if (checkPassed) {
                    return true;
                }
                return false;
            });
            results = _.map(results, function(model) {
                                    return model.toJSON();
                            });
            // Reset the existing collection to filtered models
            this.reset(results) ;
    };
    var ExtendedCollection = OriginalCollection.extend(filter);
    
    1. 将 fetch ajax 调用中的过滤器选项传递给服务器,服务器应该理解过滤器并根据它返回集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多