在 angularJS 中使用带有 'controller as' 语法的 ngRoute
Using ngRoute with 'controller as' syntax in angularJS
我有以下 config
和 controllers
.config(function($routeProvider){
$routeProvider
.when('/', {
templateUrl: 'page-home.html',
controller: 'homeController',
controllerAs: 'hctrl'
})
.when('/about', {
templateUrl: 'page-about.html',
controller: 'aboutController',
controllerAs: 'actrl'
})
.when('/contact', {
templateUrl: 'page-contact.html',
controller: 'contactController',
controllerAs: 'cctrl'
});
})
.controller('homeController', function(){
this.pageClass = 'page-home'
})
.controller('aboutController', function(){
this.pageClass = 'page-about'
})
.controller('contactController', function(){
this.pageClass = 'page-contact'
});
当我在 index.html
中使用 in 时,我的问题就来了。
<div class="page {{pageClass}}" ng-view></div>
因为我没有使用 $scope
,所以只写 {{pageClass}}
是行不通的。如何使用 controller as syntax
?
解决此问题
编辑
我得到了几个很好的答案。如果您想用不同的名称命名 controllerAs
值,我还发现了另一种方法:hctrl
、actor
和 ctrl
(如我上面的代码):
您可以在 html:
<div class="page {{hctrl.pageClass || actrl.pageClass || cctrl.pageClass}}" ng-view></div>
将控制器指定为名称
<div class="page {{hctrl.pageClass}}" ng-view></div>
无论你在 controllerAs 中写了什么,都需要将值添加到变量中,例如 {{actrl.pageClass}}
解决这个问题的一个好方法是将 pageClass
设置为路由定义中的配置,然后创建一个指令,使这些定义按照您想要的方式应用(当然在指令适用的范围)。
Javascript
使用 data 键值对象定义路由配置。
.config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'page-home.html',
controller: 'homeController',
controllerAs: 'hctrl',
data: {
pageClass: 'page-home'
}
})
.when('/about', {
templateUrl: 'page-about.html',
controller: 'aboutController',
controllerAs: 'actrl',
data: {
pageClass: 'page-about'
}
})
.when('/contact', {
templateUrl: 'page-contact.html',
controller: 'contactController',
controllerAs: 'cctrl',
data: {
pageClass: 'page-contact'
}
});
})
创建一个指令,使用指令的控制器设置这些数据。
.directive('routeData', function() {
return {
controller: 'RouteDataController',
controllerAs: 'RouteData',
bindToController: true
}
})
.controller('RouteDataController', function($rootScope, $route) {
var self = this;
$rootScope.$on('$routeChangeSuccess', setCurrentRouteData);
setCurrentRouteData();
function setCurrentRouteData() {
angular.extend(self, $route.current.$$route.data || {});
}
})
在您的 index.html 中应用指令本身并访问指令的控制器以获取 data 值。
<div ng-view route-data class="page {{ RouteData.pageClass }}"></div>
我有以下 config
和 controllers
.config(function($routeProvider){
$routeProvider
.when('/', {
templateUrl: 'page-home.html',
controller: 'homeController',
controllerAs: 'hctrl'
})
.when('/about', {
templateUrl: 'page-about.html',
controller: 'aboutController',
controllerAs: 'actrl'
})
.when('/contact', {
templateUrl: 'page-contact.html',
controller: 'contactController',
controllerAs: 'cctrl'
});
})
.controller('homeController', function(){
this.pageClass = 'page-home'
})
.controller('aboutController', function(){
this.pageClass = 'page-about'
})
.controller('contactController', function(){
this.pageClass = 'page-contact'
});
当我在 index.html
中使用 in 时,我的问题就来了。
<div class="page {{pageClass}}" ng-view></div>
因为我没有使用 $scope
,所以只写 {{pageClass}}
是行不通的。如何使用 controller as syntax
?
编辑
我得到了几个很好的答案。如果您想用不同的名称命名 controllerAs
值,我还发现了另一种方法:hctrl
、actor
和 ctrl
(如我上面的代码):
您可以在 html:
<div class="page {{hctrl.pageClass || actrl.pageClass || cctrl.pageClass}}" ng-view></div>
将控制器指定为名称
<div class="page {{hctrl.pageClass}}" ng-view></div>
无论你在 controllerAs 中写了什么,都需要将值添加到变量中,例如 {{actrl.pageClass}}
解决这个问题的一个好方法是将 pageClass
设置为路由定义中的配置,然后创建一个指令,使这些定义按照您想要的方式应用(当然在指令适用的范围)。
Javascript
使用 data 键值对象定义路由配置。
.config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'page-home.html',
controller: 'homeController',
controllerAs: 'hctrl',
data: {
pageClass: 'page-home'
}
})
.when('/about', {
templateUrl: 'page-about.html',
controller: 'aboutController',
controllerAs: 'actrl',
data: {
pageClass: 'page-about'
}
})
.when('/contact', {
templateUrl: 'page-contact.html',
controller: 'contactController',
controllerAs: 'cctrl',
data: {
pageClass: 'page-contact'
}
});
})
创建一个指令,使用指令的控制器设置这些数据。
.directive('routeData', function() {
return {
controller: 'RouteDataController',
controllerAs: 'RouteData',
bindToController: true
}
})
.controller('RouteDataController', function($rootScope, $route) {
var self = this;
$rootScope.$on('$routeChangeSuccess', setCurrentRouteData);
setCurrentRouteData();
function setCurrentRouteData() {
angular.extend(self, $route.current.$$route.data || {});
}
})
在您的 index.html 中应用指令本身并访问指令的控制器以获取 data 值。
<div ng-view route-data class="page {{ RouteData.pageClass }}"></div>