角度资源/解析延迟会导致未定义的错误

时间:2014-01-18 19:10:51

标签: javascript angularjs

我从路线的解析参数返回了一个资源:

resolve: {
  item: function(Orders, $route) {
    return Orders.get({ id: $route.current.params.id });
  }
}

项目基本上如下:

var item = {
  name: 'John',
  products: [{
    id: 123
  }, {
    id: 234
  }]
}

现在在我的控制器中我看到了这个:

app.controller('ViewOrderCtrl', function($scope, item) {
  $scope.item = item;
  $scope.$watch('item.products', function(n, o) {
    // This yields: 'undefined' is not an object (evaluating '$scope.item.products.forEach')
    $scope.item.products.forEach(function(product) { });
  }, true);
});

我相当肯定这个问题是由于资源尚未消耗而导致的,因此在加载时未定义 - 即执行console.log($scope.item.name)也会产生未定义。

有没有办法解决这个问题没有在我的手表中进行状态检查。意思我很清楚我能做到:

if($scope.item.products) {
  $scope.item.products.forEach(function(product) { });
}

我想知道是否有一些设置/技巧专门解决这个延迟问题。

3 个答案:

答案 0 :(得分:1)

只是指出来: http://docs.angularjs.org/api/ngRoute.$routeProvider

  

resolve - {Object。=} - 应该注入控制器的可选依赖关系图。如果这些依赖项中的任何一个是promise,路由器将等待它们全部被解析,或者在实例化控制器之前拒绝。如果成功解决了所有promise,则会注入已解析的promise的值并触发$ routeChangeSuccess事件。如果任何promise被拒绝,则触发$ routeChangeError事件。地图对象是:

答案 1 :(得分:0)

您需要进行状态检查,但您可以在监视功能中使用newValueoldValue参数。

$scope.$watch('item.products', function(n, o) {
    // n is the new value of "$scope.item.products"
    if (n) {
        n.forEach(function(product) {});
    }
}, true);

答案 2 :(得分:0)

像Whisher所指出的那样:

  

如果这些依赖项中的任何一个是promise,路由器将等待   在控制器出现之前,所有这些都要解决或者被拒绝   实例

承诺的关键是什么。尝试:

resolve: {
  item: function(Orders, $route) {
    return Orders.get({ id: $route.current.params.id }).$promise;
  }
}