为什么指令方法可从父范围获得

时间:2015-08-29 13:39:36

标签: angularjs

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指令。

怎么可能?指令的方法如何在指令范围之外可以访问?我没有使用绑定这个方法..

1 个答案:

答案 0 :(得分:1)

您的指令不使用隔离范围,也不创建子范围。用于在指令中声明isItemActive的范围实际上是指令的使用范围,与控制器的范围相同。您基本上覆盖了控制器的isItemActive

您需要使用scope: {}使用隔离范围,或使用scope: true创建子范围。

您可以在此处详细了解差异:https://github.com/angular/angular.js/wiki/Understanding-Scopes