【发布时间】:2017-02-16 17:54:08
【问题描述】:
我有一个component(),它注入了一个导航。当我尝试像这样在 component 中包含 controller 时,出现错误。
nav.html 内
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Demo</a>
</div>
<div id="navbar" class="collapse navbar-collapse" ng-controller="MainMenuController">
<ul class="nav navbar-nav">
<li ng-class="{ active: isActive('') }"><a href="./">home</a></li>
<li ng-class="{ active: isActive('/skus') }"><a href="sku.html">sku</a></li>
<li ng-class="{ active: isActive('/phones') }"><a href="phone.html">phone</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
component.js 内部
angular.
module('mainMenu').
component('mainMenu', {
templateUrl: 'app/core/nav/nav.html',
controller: 'MainMenuController', ['$scope', '$location',
function NavController($scope, $location) {
$scope.isActive = function (viewLocation) {
var p1 = $location.path();
var p2 = '/' + p1.split("/")[1]; // split string from '/';
if(p2=='/undefined') p2 = '';
return viewLocation === p2;
}
}
]
});
但是,如果我像这样编写一个单独的控制器,一切都会正常工作。 component() 我做错了什么,我不应该将控制器包含在 component() 中以获得最佳实践吗?
angular.
module('mainMenu').
component('mainMenu', {
templateUrl: 'app/core/nav/nav.html',
});
angular.
module('mainMenu').
controller('MainMenuController', ['$scope', '$location',
function NavController($scope, $location) {
//this.navs = Nav;
$scope.isActive = function (viewLocation) {
var p1 = $location.path();
var p2 = '/' + p1.split("/")[1]; // split string from '/';
if(p2=='/undefined') p2 = '';
return viewLocation === p2;
};
}
]);
我把我的component 改成了这个
angular.
module('mainMenu').
component('mainMenu', {
templateUrl: 'app/core/nav/nav.html',
controller: ['$scope', '$location',
function MainMenuController($scope, $location) {
//this.navs = Nav;
$scope.isActive = function (viewLocation) {
var p1 = $location.path();
var p2 = '/' + p1.split("/")[1]; // split string from '/';
if(p2=='/undefined') p2 = '';
return viewLocation === p2;
};
}
]
});
收到错误Error: [ng:areq] http://errors.angularjs.org/1.5.8/ng/areq?p0=MainMenuController&p1=not%20a%20function%2C%20got%20undefined
N
修复:通过清理 module 和 component 标题并使它们唯一,从模板中删除 ng-controller;尼尔汉密尔顿的回答解决了我原来的问题。
【问题讨论】:
-
要么指定控制器名称,要么指定控制器功能,但不能同时指定两者。删除
'MainMenuController',。另外,请永远不要再问一个问题,只是说“我有一个错误”。而是发布准确且完整的错误消息。 -
“我收到一个错误。” 什么错误??
-
用错误输出改变了我的问题
-
在您的第一个示例中,您将组件命名为与您的模块相同,这是一个禁忌。此外,您寻求的所有信息都记录在angular documentation for components。
-
再说一次,这个最新的更新验证了我的理论。您在模板中有一个
ng-controller引用。控制器被提供给整个模板,然后您尝试 重新绑定 same 控制器到模板内的元素。当您在模板之外声明控制器时,它可能会起作用,但它可能不会按您期望的方式工作,因为您实际上有同一个控制器对象的两个实例。如果只将控制器声明为属于组件,它肯定根本不起作用。
标签: angularjs