如何解决所有“插值错误”?

时间:2014-06-30 14:09:07

标签: angularjs

我遇到了很多看似

的插值错误
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(),但我觉得它开始变得有点凌乱在太多地方添加声明。

感谢。

3 个答案:

答案 0 :(得分:3)

问题似乎是您尝试访问这样的数据:someObj.prop1.prop2
虽然someObj可能如下所示:someObj = {};

因此,上述归结为:someObj.prop1.prop2 === {}.prop1.prop2 === undefined.prop2
这会导致抛出错误。


如果您的代码访问属性两个(或更多)级别,您需要处理数据尚未初始化的情况。

可能的解决方案:

  1. 将上述代码更改为:(someObj.prop2 || {}).prop1
    优点:这是一个简单快捷的解决方案。适用于代码中偶尔需要的时间。
    缺点:杂乱的代码。当你必须在整个地方使用时,这是单调乏味的。

  2. 初始化数据以包含所有属性(或导致错误的属性)的空对象。 someObj = {}将成为someObj = {prop1: {}} 优点:您只需要在一个地方修复它,然后它可以在任何地方工作(使代码更干净)。
    缺点:您需要知道数据的结构,如果有多个嵌套级别,可能会变得单调乏味。

  3. 确保在数据实际存在之前不会运行需要加载数据的函数(例如,在请求的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>