Не удалось получить доступ к изолированной области директивы angular

Первая директива:

app.directive("myDirectiveOne", function($rootScope){
    return {
        templateUrl : "/custom-one-html.html",
        restrict: "AE", 
        replace:true,
        scope: {
            somedata: "=",
            flags: "=",
            functionone: "&"
        }
        ,controller: function($rootScope,$scope, $element) {
           $scope.firstFunction = function(){
                console.log("First function is getting called")
           }
$scope.$on('firstBroadcast',function(event, data){
                $rootScope.$broadcast('secondBroadcast', data)
            });

    }

Вторая директива:

app.directive("myDirectiveTwo", function($rootScope){
    return {
        templateUrl : "/custom-two-html.html",
        restrict: "AE", 
        replace:true,
        scope: {
            data: "=",
            functiontwo: "&"
        }
        ,controller: function($rootScope,$scope, $element) {
           $scope.secondFunction = function(){
                console.log("Second function is getting called")
                $rootScope.$broadcast('firstBroadcast', {})
           }
$scope.$on('secondBroadcast',function(event, data){
                $scope.callSomeFunctionWithData(data);
            });
$scope.secondFunction();

    $scope.editFunction = function(x){
console.log("This is the edit function", x);
        }

Родительский контроллер:

$scope.parentFuntion = function(){
        console.log("No trouble in calling this function")
}

Итак, проблема в том, что когда я пытаюсь вызвать функцию из шаблона myDirectiveTwo html, активным контроллером является родительский контроллер, а не изолированный.

Может быть, это как-то связано с трансляциями, которые я использую?

HTML-код:

<div ng-repeat="x in data">
    <h5>{{x.name}}</h5>
    <button ng-click="editFunction(x)">Edit</button>
</div>

Странно то, что я получаю значения данных, и ng-repeat отлично работает при загрузке. Но когда я нажимаю на кнопку, ничего не происходит. И если я добавлю ту же функцию в родительский контроллер, она будет вызвана.. :( Как мне снова сделать активным изолированный контроллер области действия..?


person User-8017771    schedule 22.05.2018    source источник
comment
Ничего явно неправильного, не могли бы вы также вставить немного HTML или JSFiddle, воспроизводящего проблему? спасибо   -  person Protozoid    schedule 22.05.2018
comment
@Protozoid Добавлен HTML-код.   -  person User-8017771    schedule 23.05.2018


Ответы (2)


Проблема в том, что ng-repeat создает дочернюю область, поэтому editFunction оказывается в родительской области.

Из документов

... Каждый экземпляр шаблона получает свою собственную область видимости, где данная переменная цикла устанавливается на текущий элемент коллекции ...

Документы здесь

Вы можете убедиться, что это проблема, получив область действия вашего элемента кнопки и проверив $parent как таковой angular.element(document.getElementsByTagName("button")).scope()

Хотя это считается запахом кода, вы можете добавить $parent к вызову функции, чтобы получить к ней доступ, хотя имейте в виду, что теперь это создает зависимость от вашей HTML-структуры.

<button ng-click="$parent.editFunction(x)">Edit</button>

person Protozoid    schedule 23.05.2018
comment
Хорошо.. Разве не должен быть способ справиться с родительской областью в случае директив? Я имею в виду, означает ли это, что я не могу использовать ng-repeat в директиве и активировать изолированный контроллер области? Должен быть какой-то обходной путь.. - person User-8017771; 23.05.2018
comment
Что ж, обычно считается плохой практикой привязывать все к области видимости, потому что это превращается в суп области действия... вместо этого вы должны попытаться использовать синтаксис controllerAs и директивы bindToController: truein. Документы здесь - person Protozoid; 23.05.2018
comment
Большое спасибо :) Проблема заключалась в том, что я использовал устаревший метод replace:true. Это вызвало неожиданные сценарии. Как предложил @Protozoid, я просмотрел его ссылку и нашел проблему.. Цитата из официальной документации: When the replace template has a directive at the root node that uses transclude: element, e.g. ngIf or ngRepeat, the DOM structure or scope inheritance can be incorrect. See the following issues: Incorrect scope on replaced element: #9837 Different DOM between template and templateUrl: #10612 я удалил replace:true, и теперь все в порядке :) - person User-8017771; 23.05.2018

Проблема заключалась в том, что я использовал устаревший метод replace:true. Это вызвало неожиданные сценарии. Как предложил @Protozoid, я просмотрел его ссылку и нашел проблему. Цитата из официальной документации:

When the replace template has a directive at the root node that uses transclude: element, e.g. ngIf or ngRepeat, the DOM structure or scope inheritance can be incorrect. See the following issues: Incorrect scope on replaced element: #9837 Different DOM between template and templateUrl: #10612

Я удалил replace:true и теперь все в порядке :)

Это ссылка: здесь

person User-8017771    schedule 23.05.2018