Angular ui-router - 如何将已解析的数据分配给状态数据

时间:2015-01-08 01:46:48

标签: angularjs angular-ui-router

如何将已解析的数据分配到控制器代码中的状态数据?

以下代码失败

.state('restaurant', {
    abstract: true,
    url: '/:restaurantId/:restaurantName',
    resolve: {
        restaurant: ['RestaurantFactory', '$stateParams', '$state', function (RestaurantFactory, $stateParams, $state) {
            return RestaurantFactory.query({ restaurantId: $stateParams.restaurantId });
        }]
    },
    data: {
        restaurant: resolve.restaurant // fails
    },
    views: {
        'content@': {
            templateUrl: 'app/modules/restaurant/restaurant.html',                        
            controllerAs: 'RestCtrl',
            controller: ['restaurant', 'RestaurantFactory', 'AppLib', 'Page', '$scope', '$state', function (restaurant, RestaurantFactory, AppLib, Page, $scope, $state) {
                var vm = this;
                // public properties
                vm.AppLib = AppLib;
                vm.Page = Page;
                vm.restaurant = restaurant;
                $state.restaurant = restaurant;

                $scope.$on('Restaurant_Changed', function (event, data) { if (data.id === vm.restaurant.id) { vm.restaurant = data; $state.restaurant = data; } });
            }]
        }
    }
})

我需要这个功能的原因是其中一个子状态覆盖了内容@view(带来了自己的整个内容),因此如果我直接访问子状态页面,父节点的控制器永远不会被触发。有没有办法实现这一点,因为我想使用父状态URL和分享数据到子/孙子国家的能力

有什么想法吗?


解决方案

非常感谢杨力给我这个建议。这是我解决它的方式

resolve: {
    restaurant: ['RestaurantFactory', '$stateParams', '$state', '$q', function (RestaurantFactory, $stateParams, $state, $q) {
        var deferred = $q.defer();
        RestaurantFactory.query({ restaurantId: $stateParams.restaurantId })
        .then(function (data) {
            $state.restaurant = data;                            
            deferred.resolve($state.restaurant);
        })
        .then(function (data) {
            deferred.reject(data);
        })

        return deferred.promise;
    }],                    
},

0 个答案:

没有答案