嵌套状态的控制器未执行

时间:2013-11-28 00:02:07

标签: angularjs angular-ui angular-ui-router states

我有嵌套状态,父状态和子状态具有单独的控制器。但只有父州才会被执行。

我有网址结构:#/ restaurant / 2 / our-food

所以,我希望它能够加载ID为2的餐厅,然后儿童控制器加载“我们的食物”内容并处理其他一些功能。

我的代码是:

var app = angular.module("app", ['ui.router']);
app.config(function ($stateProvider, $urlRouterProvider) {
 $urlRouterProvider.otherwise("/");

$stateProvider
            .state('home', {
                url: '/',
                controller: function($scope, $stateParams) {
                        $scope.setRestaurant(0);
                }
            })
            .state('restaurant', {
                url: '/restaurant/:restaurantId',
                controller: function($scope, $stateParams, $state) {
                    console.log('first');
                    if($stateParams.restaurantId > 0) {
                        $scope.setRestaurant($stateParams.restaurantId);
                    }
                    else {
                        $state.go('home');
                    }
                }
            })
    .state('restaurant.our-food', {
        url: '/our-food',
        templateUrl: 'templates/our-food.html',
                    controller: function() {
                        console.log('second');
                    }
    });

});

1 个答案:

答案 0 :(得分:11)

您的'restaurant.our-food'状态的控制器未被执行,因为其父状态没有模板。这意味着它没有ui-view指令来附加自己的模板和控制器。即使您的父指令除了设置某个状态之外没有做任何其他操作,它也需要提供至少一个最小模板。

尝试将以下内容添加到“餐馆”状态,看看是否适合您:

template: "<div ui-view />"

这在ui-router docs中有记载:

  

记住:抽象状态仍需要自己的孩子插入。因此,如果您正在使用抽象状态   添加网址,设置解析/数据或运行onEnter / Exit功能,   那么你还需要设置模板:&lt; ui-view /&gt;'。

https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views