仅使用具有指定值的模型获取骨干集合

时间:2016-07-30 02:03:33

标签: backbone.js collections models

我有一个{name: value}

类型的字典
A = {
  name: x,
  name: y,
  name: z
}

我想要获取一个集合(包含其属性为' name'的模型),但为了获得最佳效果,我想获取属性' name&#的值39;存在于我的字典中。

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

2 个答案:

答案 0 :(得分:4)

如果您正在进行过滤客户端过滤,那么覆盖过滤方法真的不是可行的方法。
如果您以后需要,现在您不再拥有它。此外,从过滤方法中修改集合本身是一个不良的副作用。

相反,您应该使用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)});

如果您确定,您将始终在fetch上过滤集合,您可以省略传递选项并只使用解析中的字典。

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

答案 1 :(得分:0)

经过调查和试验,以下两种方法可以解决: 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调用中的过滤器选项传递给服务器,服务器应该了解过滤器并根据该过滤器返回集合。