是否可以从父控制器

时间:2015-08-21 12:20:19

标签: angularjs angularjs-directive

让我说我有这个指令。我想从父控制器内部更改指令范围的变量。可能吗?或者这是执行我想要实现的目标的正确方法。

<div ng-show="devices.autocompletelist.length > 0" auto-complete url="/search" model="device.name" template-url="/themes/dashboard/assets/js/angular/filter/views/autocomplete-template.html" filtertype="device" autocompletelist="devices.autocompletelist"></div>

指令

angular.module('autocomplete.directives',[]).directive('autoComplete',['$http',function($http){
    return {
        scope:{
            selectedTagsData:'=model',
            autocompletelist: '='
        },
        restrict: 'AE',
        templateUrl: function(elem, attrs) {
            return attrs.templateUrl 
        },
        link: function(scope, elem, attrs) {

            // I want to access and change value of selectedTagsData.data from parent controller
            scope.selectedTagsData = {
                data: ''
            }
        },

    }
}]);

应用

var app = angular.module('filterlist', ['autocomplete.directives']);

控制器

app.controller('filterCtrl', ['$rootScope', 'filterService', '$scope', '$compile', '$location', '$http', '$timeout', '$q',
function($rootScope, filterService, $scope, $compile, $location, $http, $timeout, $q) {
        $scope.deviceSelect = function(devicedata) {

            // Can I access and change value of directive scope variable 'scope.selectedTagsData.data' from here

        }
    }
]);

1 个答案:

答案 0 :(得分:0)

如果你没有在你的指令中定义范围,那么所有$ scope控制器都将通过你的指令访问,但这不是完美的解决方案,因为你没有按照关注点分离和单一责任原则, 总结一下:你的指令不应该知道有关父作用域的任何信息,你的控制器也不应该知道有关指令内部的任何信息。它们是单独层中的独立组件。

我认为如果使用transclude选项,它将解决您的问题,因为transclude使得带有此选项的指令的内容可以访问指令之外的范围而不是内部。