Вложенные директивы - нельзя передавать аргументы методу контроллера из дочерней директивы в Angularjs

У меня проблемы с вложенными директивами в angularjs. Я хочу вызвать метод контроллера из директивы в другой директиве и пытаюсь передать ему аргументы, однако они не определены.

Я пытаюсь вызвать remove () с тремя аргументами из selected.html ниже. Он работал до того, как я ввел родительскую директиву (TVFilter.js). Может ли кто-нибудь предложить, что делать, чтобы передать их контроллеру?

Спасибо!

Код:

controller.js

$scope.remove = function(selectorToRemove, choicesArr, selectedArr){
 console.log(selectorToRemove); //undefined
 console.log(choicesArr); //undefined
 console.log(selectedArr); //undefined
};

TVFilter.js

angular.module('app.directives').directive('televisionFilter', function(){
  return{
    restrict: 'A',
    templateUrl: 'js/templates/television-filter.html',
    scope: {
      search: '=',
      selectedBrand: '=',
      submit: '&',
      remove: '&'
    }
  };
});

selected.js

angular.module('app.directives').directive('selected', function(){
  return{
    restrict: 'A',
    templateUrl: 'js/templates/selected.html',
    scope:{
    choicesArr: '=',
    selectedArr: '=',
    remove: '&'
  } 
  };
});

list.html

<div television-filter search='televisionSearch' submit="submit()" selected-brand='selectedBrand' remove='remove(selectorToRemove, choicesArr, selectedArr)'></div>

TV-filter.html

<div selected selected-arr='search.selectedBrands' choices-arr='search.brands' remove='remove(selectorToRemove, choicesArr, selectedArr)'>

selected.html

<ul>
  <li ng-repeat="selected in selectedArr" class="filter-autocomplete-list"  ng-click="remove({selectorToRemove:selected, choicesArr:choicesArr,selectedArr:selectedArr})">
  <span class="label label-default label-text">{{selected}}</span> 
  </li>
</ul>

comment
Как только вы добавляете свойство области в директиву, вы создаете изолированную область. Таким образом, методы, которые вы вызываете в разметке директивы, ожидают, что эти методы будут частью области действия директивы. Сделайте демо в плункере. Неясно, каковы все ваши аргументы, когда вы вызываете встроенные функции   -  person charlietfl    schedule 29.10.2013
comment
Я упростил пример до следующего ... plnkr.co/edit/B0XK9bHVA9YZIVWcmBvq?p= предварительный просмотр   -  person jeh    schedule 30.10.2013
comment
Хорошо ... вот быстрое исправление см. link обратный вызов, который я добавил plnkr.co/edit/g4n6IScxaqHwBvCn? предварительный просмотр   -  person charlietfl    schedule 30.10.2013
comment
если вы полностью удалите свойство области из директивы, не нужно ничего делать, кстати. область будет его родителем .... контроллер   -  person charlietfl    schedule 30.10.2013
comment
Спасибо большое. Теперь работает хорошо.   -  person jeh    schedule 30.10.2013
comment
Привет .. У меня похожая проблема. Есть ли рабочая ссылка на плункер? тот, что выше, сломан !!!   -  person Satya    schedule 10.12.2013
comment
Сатья, ты должен сделать что-то вроде - link: function (scope, elem, attrs) {scope.YOURFUNCTION = scope. $ Parent.YOURFUNCTION; }   -  person jeh    schedule 22.01.2014


Ответы (1)


Ответы, предложенные в комментариях @charlietfl и @angular_james, хотя и работают, демонстрируют плохую угловую практику. Вызов $ parent нарушает точку вашей изолированной области (&). Чтобы он заработал, вам просто нужно изменить среднюю директиву (TV-filter.html) следующим образом:

<div selected selected-arr='search.selectedBrands' choices-arr='search.brands' remove='remove({selectorToRemove: selectorToRemove, choicesArr: choicesArr, selectedArr: selectedArr})'>

Обновленный plunkr

person yourdeveloperfriend    schedule 28.03.2014
comment
Как это можно сделать, используя вместо этого общий сервис? Это даже лучше, чем загрязнение прицела ?? Взгляните на мой аналогичный вопрос: stackoverflow.com/questions/26889929/ - person Michail Michailidis; 12.11.2014
comment
В качестве альтернативы вы можете пересмотреть, действительно ли необходима изоляция области, и, возможно, удалить ее и решить проблема вообще ... - person roy650; 13.01.2015