Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用ui路由器将数据从ngResource注入控制器';s决心_Javascript_Angularjs_Angular Ui Router_Promise_Ngresource - Fatal编程技术网

Javascript 使用ui路由器将数据从ngResource注入控制器';s决心

Javascript 使用ui路由器将数据从ngResource注入控制器';s决心,javascript,angularjs,angular-ui-router,promise,ngresource,Javascript,Angularjs,Angular Ui Router,Promise,Ngresource,在angular ui router文档中指出,只有在解决了所有承诺(包括从远程服务器获取数据)之后,才会实例化控制器 我有一个$resource实例: angular.module('app') .factory('Item', item); item.$inject = ['$resource']; function item($resource) { return $resource('/items/:id/', {id: '@id'}, { updat

在angular ui router文档中指出,只有在解决了所有承诺(包括从远程服务器获取数据)之后,才会实例化控制器

我有一个$resource实例:

angular.module('app')
    .factory('Item', item);

item.$inject = ['$resource'];

function item($resource) {
    return $resource('/items/:id/', {id: '@id'}, {
        update: {method: 'PATCH'}
    });
}
我定义了一个从url获取id并从REST API检索数据的状态:

     $stateProvider.state('item', {
            url: '/item/:itemId',
            templateUrl: '../components/item/item.html',
            controller: 'ItemController',
            resolve: {
                item: function ($stateParams, Item) {
                    return Item.get({id: $stateParams.itemId});
                }
            }
        })
在控制器中,我尝试使用一个Item参数,假设控制器正常工作,那么所有数据都已提取,我可以自由使用它:

angular.module('app')
    .controller('ItemController', ItemController);

ItemController.$inject = ['$scope', 'item', 'Item'];

function ItemController($scope, item, Item) {

        $scope.item = item;
        $scope.similarItems = Item.query({item_type__id: $scope.item.item_type_detail.id});
} 
但是浏览器给了我这个错误:

TypeError:无法读取未定义的属性“id”

并指向这一行,这意味着$scope.item.item\u type\u detail仍然未定义,换句话说,未解析

但是如果我将我的第二个项调用(在控制器中)封装在$timeout中,比如5000ms,它就可以正常工作,这意味着问题不在于ajax调用或不正确的依赖项注入,而在于控制器在承诺解决之前以某种方式被实例化。
如何解释这一点?我可以做些什么来修复它?

向解析器函数返回承诺:

$stateProvider.state('item', {
    url: '/item/:itemId',
    templateUrl: '../components/item/item.html',
    controller: 'ItemController',
    resolve: {
        item: function ($stateParams, Item) {
            //return Item.get({id: $stateParams.itemId});
            return Item.get({id: $stateParams.itemId}).$promise;
            //return promise --------------------------^^^^^^^^^
        }
    }
})
重要的是要认识到调用
$resource
对象方法会立即返回一个空引用。从服务器返回数据后,现有引用将填充实际数据


通过返回
$promise
属性,路由器将等待来自服务器的数据。

什么是
Item.get({id:..
看起来像?@DanielB它返回一个承诺,然后从REST API解析为json格式的某个项目实例。使用
$resource
承诺。
$resource
方法不返回完成的数据….它返回一个空对象或数组,在请求完成后将填充该对象或数组。这在docsT中进行了解释非常感谢。这实际上解决了我的问题。