控制器与指令不起作用

时间:2015-09-22 12:56:11

标签: angularjs

我希望通过单击Bootstrap模块来完成可滚动内容。它的工作正常。这是我的指令的代码:

'use strict';
angular.module('cbookApp')
        .directive('scrollTo', scrollTo);

scrollTo.$inject = ['$anchorScroll'];
function scrollTo($anchorScroll) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            element.bind('click', function (event) {
                event.stopPropagation();
                var location = attrs.scrollTo;
                if (scope.vm.isEdit || typeof scope.vm.isEdit =="undefined" ) { 
                    $anchorScroll(location);
                } else {
                    $anchorScroll(location+'1');
                }
            });
        }
    };
}

但唯一的问题是我不确定如何将活动类应用于当前词缀li。我发现这种DEMO方式可以将课程active应用到当前li并从其他地方删除。它在没有Controller as的情况下工作,但是一旦我添加了控制器,因为它停止工作并给出了一些范围错误。

var app = angular.module('app', ['directives']);
app.controller('firstController',[function(){
    var vm = this;
    vm.model = { value: 'dsf'};
}]);
angular.module('directives', []).directive('toggleClass', function () {
    var directiveDefinitionObject = {
        restrict: 'A',
        template: '<span ng-click="localFunction()" ng-class="selected"  ng-transclude></span>',
        replace: true,
        bindToController: true,
        scope: {
            model: '='
        },
        transclude: true,
        link: function (scope, element, attrs) {
            scope.localFunction = function () {
                scope.model.value = scope.$id;
            };
            scope.$watch('model.value', function () {
                if (scope.model.value === scope.$id) {
                    scope.selected = "active";
                } else {
                    scope.selected = '';
                }
            });
        }
    };
    return directiveDefinitionObject;
});

2 个答案:

答案 0 :(得分:2)

你能否在你的指令中添加它。

element.parent().parent().children().each(function() {
    $(this).find('a').removeClass('active');
});
element.addClass('active');

答案 1 :(得分:0)

http://jsfiddle.net/hngzxmda/1/

我建议在你的指令中使用controllerAs

angular.module('directives', []).directive('toggleClass', function () {
    var directiveDefinitionObject = {
        restrict: 'A',
        template: '<span ng-click="vmd.localFunction()" ng-class="selected"  ng-transclude></span>',
        replace: true,
        bindToController: {
            model: '=',
            $id: '='
        },
        scope: {},
        transclude: true,
        controller: function() {
            var _this = this;
            this.localFunction = function () {
                _this.model.value = _this.$id;
            };
        },
        controllerAs: 'vmd'
    };
    return directiveDefinitionObject;
});