使用'控制器作为'使用ui-router并没有按预期工作

时间:2015-03-09 22:58:17

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

对于使用抽象状态和控制器作为语法的页面,我有以下状态设置:

# Details page route
.state 'title', 
  url: '/title',
  abstract: true,
  template: '<ui-view/>',
.state 'title.show', 
  url: '/:titleId',
  templateUrl: 'title/show.html'
  controller: 'Title as t'

出于本演示的目的,我可以说我将一个变量分配给'Title'控制器的't'实例,我在Title控制器函数中执行此操作。

angular.module('title').controller 'Title',
 ['$state', ($state) ->
   this.name = 'Test'

在我的视图'title / show.html'中,我尝试打印出刚创建的变量到页面:

{{t.name}}

我什么都没看到。但是,如果我将ui-router的控制器移到包含'title / show.html'页面的元素上,如下所示:

<div ng-controller="Title as t">

然后一切都很好。有没有人遇到过这个问题。我在其他应用程序中工作正常,所以我仍然想弄清楚这个应用程序可能有什么不同,可能是js库版本的差异。

5 个答案:

答案 0 :(得分:43)

在您的州配置中:

而不是controller: 'Title as t',请尝试:

controller: 'Title',
controllerAs: 't'

修改:刚刚使用ui-router实施了一个最小应用,语法controller: Title as t也适用于ui-router版本0.2.0中的最新版本截至今日。当我检查角度范围时,我可以看到t实例。

答案 1 :(得分:12)

您的控制器需要返回this的值才能使controllerAs功能正常工作。由于CoffeeScript隐式返回最后一行,因此您需要编写:

return this

或者如果您使用的是vm语法并且已写入:

vm = this

你可以在控制器的最后写一下:

return vm

答案 2 :(得分:10)

如果这可以帮助任何人,我的问题来自使用模板化视图,但在views元素之外指定controllerAs。这需要永远弄明白。感谢此帖子https://github.com/driftyco/ionic/issues/3058

**错误**

views: {'content@': { templateUrl: 'views/listing.html' }},
controller: 'ListingCtrl',
controllerAs: 'ctrl'

**正确**

views: {
  'content@': { templateUrl: 'views/listing.html' },
   controller: 'ListingCtrl',
   controllerAs: 'ctrl'
}

答案 3 :(得分:1)

似乎这些答案可能会起作用很多。我带着不同的问题来到这里:

在我的UI Router Javascript文件中,我的controllers定义如下:

state('groupHome', {
     url: '/groupHome',
     templateUrl: 'app/modules/group-home/groupHome.html',
     controller: 'GroupHomeController',
     controllerAs: 'groupHomeController'

在我的模板文件中,如果我尝试访问名为groupHomeController的控制器,则无法访问。

但另一方面,当我将代码更改为此时:

state('groupHome', {
     url: '/groupHome',
     templateUrl: 'app/modules/group-home/groupHome.html',
     controller: 'GroupHomeController as groupHomeController'

完美无缺。

答案 4 :(得分:0)

您需要在return this;末尾controller function controllerAs语法才能正常工作。

angular.module('title').controller 'Title',
 ['$state', ($state) ->
   this.name = 'Test'
   return this

如果您使用 $scope ,则必须改为return $scope

angular.module('title').controller 'Title',
 ['$state','$scope', ($state, $scope) ->
   $scope.name = 'Test'
   return $scope

祝你好运。