如何在使用具有嵌套视图的 ui 路由器时添加用户控制器
How to add user controller when using ui-router with nested views?
我正在使用带有嵌套视图的ui-router
在用户配置文件页面上显示一些包含用户数据的表。以下是路线的概述:
routes.config.js
(function() {
'use strict';
angular.module('app.routes').config(routesConfig);
routesConfig.$inject = ['$stateProvider', '$locationProvider', '$urlRouterProvider', 'RouteHelpersProvider'];
function routesConfig($stateProvider, $locationProvider, $urlRouterProvider, helper){
// Set the following to true to enable the HTML5 Mode
// You may have to set <base> tag in index and a routing configuration in your server
$locationProvider.html5Mode(false);
// defaults to dashboard
$urlRouterProvider.otherwise('/app/home');
//
// Application Routes
// -----------------------------------
$stateProvider
.state('app', {
url: '/app',
abstract: true,
templateUrl: helper.basepath('app.html'),
resolve: helper.resolveFor('fastclick', 'modernizr', 'icons', 'screenfull', 'animo', 'sparklines', 'slimscroll', 'classyloader', 'toaster', 'whirl','loaders.css', 'spinkit','jquery-ui', 'jquery-ui-widgets','weather-icons', 'skycons')
})
.state('app.home', {
url: '/home',
title: 'Home',
templateUrl: helper.basepath('home.html'),
})
.state('app.user', {
abstract: true,
templateUrl: helper.basepath('user.html'),
// controller: 'UserPageController',
// controllerAs: 'userCtrl',
resolve: helper.resolveFor('datatables')
})
.state('app.user.dashboard', {
url: '/user',
title: 'User',
controller: 'UserPageController',
controllerAs: 'userCtrl',
views: {
'eventTable': {
templateUrl: helper.basepath('userProfile/eventTable.html'),
controller: 'EventTableController',
controllerAs: 'eventCtrl'
},
'bankStatement': {
templateUrl: helper.basepath('userProfile/bankStatement.html'),
controller: 'BankStatementController',
controllerAs: 'bankCtrl'
},
'purchasesTable': {
templateUrl: helper.basepath('userProfile/purchasesTable.html'),
controller: 'PurchasesTableController',
controllerAs: 'purchasesCtrl'
},
'paymentsTable': {
templateUrl: helper.basepath('userProfile/paymentsTable.html'),
controller: 'PaymentsTableController',
controllerAs: 'paymentsCtrl'
},
'clicksTable': {
templateUrl: helper.basepath('userProfile/clicksTable.html'),
controller: 'ClicksTableController',
controllerAs: 'clicksCtrl'
},
}
});
} // routesConfig
})();
当我尝试添加另一个控制器以显示用户的基本信息时(我尝试将控制器添加到app.user
并app.user.dashboard
),控制器永远不会激活。以下是相关代码的其余部分:
用户.html
<h3 class="fixedSubHeader">{{userCtrl.userInfo}}</h3>
<section ui-view="eventTable"></section>
<section ui-view="bankStatement"></section>
<section ui-view="paymentsTable"></section>
<section ui-view="purchasesTable"></section>
<section ui-view="clicksTable"></section>
userPage.controller.js
(function() {
'use strict';
angular
.module('app.userPage')
.controller('UserPageController', UserPageController);
UserPageController.$inject = ['$resource'];
function UserPageController($resource) {
var vm = this;
activate();
// console.log("USER!!!!!");
////////////////
function activate() {
// Ajax
$resource('server/basic-info-table.json').query().$promise.then(function(userInfo) {
vm.userInfo = userInfo;
});
}
}
})();
我最初认为这是userPage控制器的问题,所以我尝试注入$scope
并摆脱var vm = this
语法。然而,这种方法也没有奏效。任何帮助将不胜感激。谢谢
据我所知,您正在尝试为所有 ui 视图使用一个控制器UserPageController
,然后它们有自己的控制器。
所以我假设您希望UserPageController
成为所有这些 ui 视图的父控制器。要做到这一点,这些都应该是他们自己的状态。使它们成为app.user.dashboard
的孩子状态。
例如:
$stateProvider
.state('app.user.dashboard', {
url: '/user',
title: 'User',
controller: 'UserPageController',
controllerAs: 'userCtrl'
})
.state('app.user.dashboard.eventTable', {
views: {
'eventTable@dashboard': {
templateUrl: helper.basepath('userProfile/eventTable.html'),
controller: 'EventTableController',
controllerAs: 'eventCtrl'
}
}
},
// Repeat the other states here...
);
而在user.html
中,你可以使用这样的ui视图:
<section ui-view="eventTable@dashboard"></section>
现在,app.user.dashboard
的每个子状态都将具有可以从中继承的UserPageController
的父控制器,同时它们也可以拥有自己的控制器。
如果您处于app.user.dashboard
状态并且您过渡到 app.user.dashboard.eventTable
,您仍将处于app.user.dashboard
,但是现在app.user.dashboard.eventTable
将是父状态中的一种"子状态",而不必离开父状态,至少在 UI 方面。
请注意,如果您在app.user.dashboard
上没有任何默认内容,那么您可能希望过渡到某个默认子状态,这样您就不会留下一些空白屏幕。
您可以通过首先在app.user.dashboard
状态中添加默认参数来执行此操作:
$stateProvider
.state('app.user.dashboard', {
url: '/user',
title: 'User',
controller: 'UserPageController',
controllerAs: 'userCtrl'
defaultChildState: 'app.user.dashboard.eventTable'
})
// ...
。然后在run
块中,添加如下内容:
$rootScope.$on('$stateChangeStart', function(event, toState, toParams) {
if (toState.defaultChildState) {
event.preventDefault();
$state.go(toState.defaultChildState, toParams);
}
});
上面的代码基本上会在你去app.user.dashboard
时检查defaultChildState
属性,然后它会进入那个状态。所以任何时候你去app.user.dashboard
,你实际上要app.user.dashboard.eventTable
,或者你命名的任何其他默认状态。
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- AngularJS UI路由器不能像ng路由器那样工作
- AngularJS ui路由器html5模式中断路由
- EJS中的Angularjs-Ui路由器参数
- 使用AngularJS中的UI路由器将状态重定向到默认子状态
- 如何在ui路由器angularjs中只更改子ui视图,同时保持父视图不变
- 在UI路由器中以抽象状态填充常见视图
- angularjs中带有ui路由器的嵌套视图
- 当需要身份验证时,ui路由器不会重定向
- Ui路由器:获取控制器中视图的名称
- 在Angular ui路由器中,如何将事件从一个视图发送到另一个视图
- 带有嵌套状态的Angular ui路由器和后退按钮
- 如何加载嵌套3个状态的UI路由器UI视图模板
- Angular ui路由器中的绝对名称
- 如果设置了位置,如何在每个状态下检查路由器ui,如果没有,则转到登录页
- AngularJS ui路由器:ui sref和指令
- Angular UI路由器:UI不使用参数构建href
- Angular嵌套路由器ui
- 为什么我的路由器UI在angular.js中没有像预期的那样工作
- AngularJS-路由器UI-定义通配符父级状态