AngularJS v1.2.28
这是我的侧边栏控制器:
angular.module('core').controller('SidebarController', ['$scope', '$location',
function($scope, $location) {
$scope.isItemActive = function (section) {
return ($location.path() === section);
};
}
]);
侧边栏的模板:
<section data-ng-controller="SidebarController">
<a ui-sref="dashboard.new-subscription"
ui-route="/dashboard/subscription/new"
class="item "
ng-class="{active: isItemActive('/dashboard/subscription/new')}">
+ New Subscription
</a>
<subscriptions-list></subscriptions-list>
</section>
订阅列表的指令:
angular.module('core').directive('subscriptionsList', ['Subscription', '$state', '$location',
function(Subscription, $state, $location) {
return {
templateUrl: '/modules/core/views/subscriptions-list.client.view.html',
restrict: 'E',
link: function postLink(scope, element, attrs) {
....
scope.isItemActive = function(path, subscription) {
var curPath = path + '/' + subscription._id;
return ($location.path() === curPath);
};
}
};
}
]);
如您所见,控制器和指令都具有isItemActive功能。 出于某种原因,当我在sidebars模板中调用isItemActive('/ dashboard / subscription / new')时,我收到错误“无法读取未定义的属性'_id',因为它从subscriptionsList指令调用isItemActive()而不是controller指令。
怎么可能?指令的方法如何在指令范围之外可以访问?我没有使用绑定这个方法..
答案 0 :(得分:1)
您的指令不使用隔离范围,也不创建子范围。用于在指令中声明isItemActive
的范围实际上是指令的使用范围,与控制器的范围相同。您基本上覆盖了控制器的isItemActive
。
您需要使用scope: {}
使用隔离范围,或使用scope: true
创建子范围。
您可以在此处详细了解差异:https://github.com/angular/angular.js/wiki/Understanding-Scopes