Backbone.js - 对象不支持 属性 或方法 'each'

Backbone.js - Object doesn't support property or method 'each'

我对 Backbone 非常缺乏经验,但继承了另一个开发人员的代码来维护。我正在尝试向模型添加一些新功能。这是我目前拥有的:

    var AfeDetailCollection = Backbone.Collection.extend(
    {
        model: AfeDetailModel,
        getSubtotalUSD: function(){
            return _.reduce(this.models, function(memo, model, index, list){
                return memo + model.getExtCostUSD();
            }, 0, this);
        },
        getSubtotalLocal: function () {
            return _.reduce(this.models, function (memo, model, index, list) {
                return memo + model.getExtCostLocal();
            }, 0, this);
        },
        hasMixedCurrency: function () {
            var currCode = '';
            this.models.each(function (model) {
                if (currCode == '')
                    // Identify the currencyCode of the first AfeDetail object in the collection
                    currCode = model.get('currencyCode');
                else if (currCode != model.get('currencyCode'))
                    // The currencyCode has changed from prior AfeDetail in the collection
                    return true;
            });
            return false;
        }
    }
);

hasMixedCurrency() 函数是我添加的。这两个预先存在的功能工作正常。我要做的是确定 AfeDetail 对象的集合是否包含多个 currencyCode 值(AfeDetail 模型上的 属性)。所以我只是想遍历这个集合,直到我发现 currencyCode 发生变化,然后 return true.

但是,在我页面上的 javascript 中,一旦我尝试检查这个...

if (this.collection.hasMixedCurrency()) {
   ...

...我明白了:错误:对象不支持 属性 或方法 'each'

我显然做错了什么,可能是一些简单的事情,但我只是没有看到。

看起来 this.models 是一个 javascript 数组 ,而不是 backbonecollection.

你可以试试下划线的每个方法:

_.each(arr, function(val) { 

});

你的循环逻辑看起来也不对。试试这个代码:

hasMixedCurrency: function() {
    return _.size(_.uniq(this.models, "currencyCode")) > 1;
}

jsFiddle


Edit: More performanced way

hasMixedCurrency: function () {
    return _.find(this.models, function(v) { return v.currencyCode !== _.first(this.models).currencyCode; }) !== undefined;
}