Backbone.js报错:Object不支持‘each’属性或方法求助
解决Backbone.js集合中
hasMixedCurrency方法的报错问题 嘿,你的问题很典型,刚接触Backbone的时候很容易踩这个坑!
报错原因
你在hasMixedCurrency方法里调用了this.models.each(),但这里的this.models是原生JavaScript数组,它并没有Backbone集合特有的each方法——只有Backbone.Collection实例本身才有each方法,原生数组的遍历方法是forEach,不过我们通常用Underscore提供的工具方法来处理。
修复方案
这里有几种简单的修复方式,选你习惯的就行:
方案1:直接使用Collection实例的each方法
Backbone.Collection本身就自带each方法,直接用this.each()代替this.models.each()就好,代码更简洁:
hasMixedCurrency: function () { var currCode = ''; this.each(function (model) { if (currCode == '') // 识别集合中第一个AfeDetail对象的currencyCode currCode = model.get('currencyCode'); else if (currCode != model.get('currencyCode')) // 集合中后续AfeDetail的currencyCode发生变化 return true; }); return false; }
方案2:用Underscore的_.each遍历models数组
因为Backbone依赖Underscore,所以可以直接用_.each()来遍历原生数组:
hasMixedCurrency: function () { var currCode = ''; _.each(this.models, function (model) { if (currCode == '') currCode = model.get('currencyCode'); else if (currCode != model.get('currencyCode')) return true; }); return false; }
额外优化建议
顺便提一句,你原代码里的return true其实不会立刻让整个方法返回,因为each会遍历完所有元素才停止。如果想让逻辑更高效,一旦发现不同的currencyCode就终止遍历,可以用Underscore的_.some方法:
hasMixedCurrency: function () { // 先获取第一个模型的currencyCode,处理集合为空的情况 var firstModel = this.at(0); if (!firstModel) return false; var currCode = firstModel.get('currencyCode'); // _.some会在找到第一个符合条件的元素时立刻返回true,停止遍历 return _.some(this.models, function(model) { return model.get('currencyCode') !== currCode; }); }
这个写法不仅更高效,逻辑也更清晰,推荐你试试~
内容的提问来源于stack exchange,提问作者PongGod
相关产品推荐
相关产品推荐

