2016-01-28 5 views
0

У меня есть директива, которая наследует ее область действия от контроллера. В этой Директиве есть несколько методов, когда я пытаюсь вызвать эти методы из родительского контроллера, он говорит, что метод не определен.AngularJs - методы ограниченной области действия недоступны в контроллере

Родитель Контроллер:

app.controller('ParentController', ['$scope', function($scope){ 
    $scope.items = []; //Array of Objects. 
    $scope.someMethod = function(item){ 
     $scope.directiveMethod(item.id); 
    } 
}]); 

Директива:

app.directive('someDirective', function(){ 
    return { 
     restrict: 'A', 
     link: function(scope, el, attrs){ 
      scope.tableGreen = function(id){ 
       var element = angular.element('[data-cell='+id+']') 
       element.removeClass('some-class') 
       element.addClass('new-class') 
      } 
     } 
    } 
}) 

HTML:

<div ng-controller="ParentController"> 
    <div ng-repeat="item in items"> 
     <button ng-click="someMethod(item)" >Green</button> 
    </div> 

    <div ng-include="/path/to/some/place"> 
     <div class="some-class" some-directive></div> 
    </div> 
</div> 

Является ли это правильный подход? Или есть лучший способ?

+0

Это очень неправильный подход. директива может знать контроллер, но контроллер должен определенно не знать модель директивы. это противоречит всей концепции директив и инкапсуляции. – Daniel

+0

, пожалуйста, прочтите следующее: http://stackoverflow.com/questions/17900201/how-to-access-parent-scope-from-within-a-custom-directive-with-own-scope-in-an –

+0

Я думаю, вы используйте $ broadcast или $ emit для этой работы. это идеальная работа для этого состояния. – Sandeep

ответ

0

Если вы пытаетесь переключить класс элемента срабатывает из-за пределов в ng-include один подход мог бы использовать ng-class на сам элемент:

<div ng-class="{'some-class': item.selected, 'new-class': !item.selected}">content</div> 

Это может избежать делать манипуляции класса с помощью другой функции и использовать встроенную угловую директиву, ng-класс (https://docs.angularjs.org/api/ng/directive/ngClass).

Если вам по-прежнему необходимо прикрепить другие функции к элементу, вы можете, конечно, включить ng-класс в шаблон директивы.

Возьмите этот plnkr, например: http://plnkr.co/edit/Jpr2ayywYYBwiIesmfko?p=preview, он имеет набор элементов в родительском контроллере, а затем ng-include, который ссылается на эти элементы. Класс изменяется на элементах внутри ng-include из их шаблонов директив с помощью ng-class.

+0

Сначала я думал об использовании 'ng-class', но у меня есть классы, входящие в ответ API с некоторыми другими данными. Вот почему мне нужно сделать манипуляции с классом из директивы. – Dwijen

+0

Отметьте это как правильный ответ, потому что, если вы думаете достаточно сложно, вы найдете способ манипулировать классом с помощью 'ng-class'. – Dwijen

0

Присвойте методу $ parent scope в директивной ссылке.

app.directive('someDirective', function(){ 
    return { 
     restrict: 'A', 
     link: function(scope, el, attrs){ 
      scope.$parent.directiveMethod = function(id){ 
       var element = angular.element('[data-cell='+id+']') 
       element.removeClass('some-class') 
       element.addClass('new-class') 
      } 
     } 
    } 
}) 
Смежные вопросы