我从路线的解析参数返回了一个资源:
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) { });
}
我想知道是否有一些设置/技巧专门解决这个延迟问题。
答案 0 :(得分:1)
只是指出来: http://docs.angularjs.org/api/ngRoute.$routeProvider
resolve - {Object。=} - 应该注入控制器的可选依赖关系图。如果这些依赖项中的任何一个是promise,路由器将等待它们全部被解析,或者在实例化控制器之前拒绝。如果成功解决了所有promise,则会注入已解析的promise的值并触发$ routeChangeSuccess事件。如果任何promise被拒绝,则触发$ routeChangeError事件。地图对象是:
答案 1 :(得分:0)
您需要进行状态检查,但您可以在监视功能中使用newValue
和oldValue
参数。
$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;
}
}