我遇到了很多看似
的插值错误Error: [$interpolate:interr] http://errors.angularjs.org/1.2.17/$interpolate/interr?p0=%20%7B%7BcalcPric…7D%7D%20&p1=TypeError%3A%20Cannot%20read%20property%20'0'%20of%20undefined
at Error (native)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:6:450
at Object.r (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:79:446)
at h.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:108:321)
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:111:451)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:18:303
at Object.d [as invoke] (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:34:479)
at c (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:18:211)
at dc (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:18:420)
at Wc (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js:17:491)
我的代码在https://github.com/magician11/bitcoin-rate-assessor/blob/master/js/bitcoin.js
,演示在这里http://bitcoin.golightlyplus.com/
基本上,我从其他API获取数据。我的代码使用的数据结构将在填充之前包含外部数据。
因此演示将自行解决,因为它会在几秒钟后正确显示。但修复我的代码的最佳方法是什么,所以我没有遇到这些错误?
用于初始化这些数据结构的一些虚拟数据?我开始尝试使用angular.isDefined()
,但我觉得它开始变得有点凌乱在太多地方添加声明。
感谢。
答案 0 :(得分:3)
问题似乎是您尝试访问这样的数据:someObj.prop1.prop2
虽然someObj
可能如下所示:someObj = {};
因此,上述归结为:someObj.prop1.prop2 === {}.prop1.prop2 === undefined.prop2
这会导致抛出错误。
如果您的代码访问属性两个(或更多)级别,您需要处理数据尚未初始化的情况。
将上述代码更改为:(someObj.prop2 || {}).prop1
优点:这是一个简单快捷的解决方案。适用于代码中偶尔需要的时间。
缺点:杂乱的代码。当你必须在整个地方使用时,这是单调乏味的。
初始化数据以包含所有属性(或导致错误的属性)的空对象。 someObj = {}
将成为someObj = {prop1: {}}
优点:您只需要在一个地方修复它,然后它可以在任何地方工作(使代码更干净)。
缺点:您需要知道数据的结构,如果有多个嵌套级别,可能会变得单调乏味。
确保在数据实际存在之前不会运行需要加载数据的函数(例如,在请求的success
回调上运行此类函数)。
优点:它可能是最干净,最易维护的方法
缺点:并非总是可行或需要对业务逻辑的实施方式进行一些修改。
答案 1 :(得分:0)
您的错误位于第18行:
var latestUSDequivFromBcId = CurrencyConversions.convertToUSD($scope.latestAsksFromBcId[0][0], 'IDR');
看起来$ scope.latestAsksFromBcId未定义或$ scope.latestAsksFromBcId [0]未定义
答案 2 :(得分:0)
如果您在范围或控制器的html
中直接使用了某些内容,而您的控制器尚未初始化,请使用ng-if
。像
<div ng-controller="pageCtrl as ctrl">
<div ng-if="ctrl.initialized">
<td><input title="ctrl.getProperty('commonProperties.add')"
ng-change="ctrl.changed()" /></td>
...
..
</div>
</div>