2015-09-10 3 views
1

Я создаю directive в angularJS который заменит мой пользовательский элемент с некоторыми элементами (постраничным), элементами, которые генерируются с помощью directive имеет ng-click атрибут и значение из ng-click атрибута является функцией контроллера, но ng-click не работаетнг-клик не работает, если элемент генерируется в соответствии с директивой

элемент является

<my-element totalCount="5"></my-element> 

контроллер

.controller('AppControler',['$scope'],function($scope){ 
    $scope.function1 = function(value){ 
     console.log('in function1 value = '+value); 
    } 
}); 

Директива

.directive('myElement',function(){ 
    return{ 
     restrict: 'E', 
     replace: true, 
     scope:{ 
      totalCount: '@' 
     }, 
     template: '<ul class="pagination"></ul>`, 
     controller: function($scope, $element, $attrs){ 
      $scope.draw = function(){ 
       $($element).empty(); 
       for (var i=1; i<=$scope.totalCount; i++){ 
        var link = $('<li><a href="javascript:;" ng-click="function1('+i+');">'+i+'</a></li>'); 
        $($element).append(link); 
       } 
      } 
     }, 
     link: function(scope, element, attr, controller){ 
      attr.$observe('totalCount', function(){ 
       scope.draw(); 
      }); 
     } 
    }; 
}); 

Но когда я нажимаю на <li> элемента, function1 из AppController не вызывается.

Update1

На самом деле мой directive имеет isolate-scope и если я скомпилировать элемент с $($element).append($compile(link)($scope)); тогда элемент, связанный с областью в директивы, но я хочу, чтобы скомпилировать элемент с областью родительского

UPDATE2

Я внесли некоторые изменения в мой элемент, например

<my-element totalCount="5" func-to-call="function1()"></my-element> 

В директиве

.directive('myElement',function($compile){ 
    return{ 
     ... 
     ... 
     scope:{ 
      totalCount: '@', 
      funcToCall: '&' 
     }, 
     ... 
     controller: function($scope, $element, $attrs){ 
      $scope.draw = function(){ 
       .... 
       .... 
       var link = $('<li><a href="javascript:;" ng-click="function2('+i+');">'+i+'</a></li>'); 
       $($element).append($compile(link)($scope)); 
       .... 
       .... 
      } 
      $scope.function2 = function(value){ 
       console.log('function2 value = '+value); 
       $scope.funcToCall(value); 
      } 
     } 
     .... 
     .... 
    }; 
}); 

в этом случае function2 директивной рамка зовет и печать значения в консоли, но $ рамки.funcToCall (значение) дает ошибку в

TypeError: Cannot use 'in' operator to search for 'function1' in <3> 

Update3

Создано PLUNKER

+0

Родительская область ограничена в директиве '' myElement'', поскольку она имеет '' выделенную область''. Чтобы вызвать функцию в контроллере из директивы, необходимо передать функцию контроллера в директиву и передать ее как область с помощью '' & '' внутренней директивы. См. Https://weblogs.asp.net/dwahlin/creating-custom-angularjs-directives-part-2-isolate-scope. Надеюсь, что это поможет и, если возможно, создаст скрипку или плункер, реплицирующую эту проблему. –

+0

@SameerK Ссылка на плункер добавлена, если вы нажмете на какой-либо номер страницы, вы получите ошибку – Dau

+0

Вы пропустили значение пропуска в директивном вызове '' ' '. См. Рабочий PLUNKER по адресу http://plnkr.co/edit/LFgiTyG5zcSdqfkGq1qZ?p=preview. Я изменил параметры, переданные функции контроллера. используя справочный метод. –

ответ

0

Для вызова внешней функции (функции управления) в вашем случае из директивы, когда директива имеет isolated scope, необходимо передать функцию контроллера директиве, как показано ниже.

<my-element func-to-call="function1" total-count="5"></my-element>

Тогда эта функция будет доступна в директиве как локальной изолированной сферы, как

scope: { totalCount: '@', funcToCall: '&' },

Далее мы можем иметь функцию внутри контроллера директивы, чтобы вызвать эту функцию внешнего (конечно, есть и другие)

$scope.function2 = function(value){  
     $scope.funcToCall()(value); 
    } 

Затем, наконец, мы можем позвонить $ scope.function2 в элементе директивы, подобном var link = $('<li><a ng-click="function2('+i+');">'+i+'</a></li>');

Ниже приведен полный директивный код.

app.directive('myElement', function($compile){ 
return{ 
    restrict: 'E', 
    replace: true, 
    scope: { 
    totalCount: '@', 
    funcToCall: '&' 
    }, 
    template: '<ul class="pagination"></ul>', 
    controller: function($scope, $element, $attrs){ 

    $scope.draw = function(){ 
     $($element).empty(); 
     for (var i=1; i<$scope.totalCount; i++){ 
     var link = $('<li><a ng-click="function2('+i+');">'+i+'</a></li>'); 
     $($element).append($compile(link)($scope)); 
     } 
    } 

    $scope.function2 = function(value){ 
     //console.log('function2 value = '+value); 
     $scope.funcToCall()(value); 
    } 
    }, 
    link: function(scope, element, attr, controller){ 
    scope.draw(); 
    } 
}; 
}); 
0

Вы должны использовать $compile перед добавлением его в DOM, как,

var link = '<li><a href="javascript:;" ng-click="function1('+i+');">'+i+'</a></li>'; 
$($element).append($compile(link)($scope)); 

Эта проблема аналогична Dynamic content added with AngularJS click event not working on the added content

Обновление: Вы можете передать = управления двунаправленного связывания, как,

scope: { 
    control: '=' 
}, 

Final Обновлено не нужно добавить еще один вызов $scope.$parent.function1(value); в вашем function2 call как,

$scope.function2 = function(value){ 
    console.log('function2 value = '+value); 
    $scope.$parent.function1(value); 
} 

Demo

+0

function1 определен в AppController не внутри директивы. Если я определяю функцию1 внутри директивы, то ее рабочий тон с компиляцией $, но не вызывает функцию 1 AppController. – Dau

+0

Поскольку директива имеет область выделения, элементы, связанные с областью действия директивы, но Я хочу связать элемент с родительской областью – Dau

+0

Ссылка на Plunker добавлена, пожалуйста, посмотрите, когда вы нажмете на какой-либо номер страницы, вы получите сообщение об ошибке – Dau

1

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

scope:{ 
    totalCount: '@', 
    fnt : '&' 
} 

связывают его нг нажмите ng-click="fnt()"

и передать его от родительского элемента будет выглядеть следующим образом:

<my-element totalCount="5" fnt="parentFunction"></my-element> 
+0

Ссылка на плунжер добавлена, пожалуйста, посмотрите, когда вы нажмете на любой номер страницы, вы получите ошибку – Dau

+0

@Dau зафиксировал передача родительской функции в fnt = "parentFunction" вместо fnt = "parentFunction()" –

 Смежные вопросы

  • Нет связанных вопросов^_^