Передать функцию из области видимости контроллера в область видимости директивы

0

Я использую AngularJS и пытаюсь передать функцию в области моего контроллера в область выделения директивы.

Я знаю, что делал это раньше, но на этот раз у меня проблемы.

Функция принимает два входа и записывает их на консоль.

Однако, когда я передаю его в свою директиву как

<div my-dir my-function="functionName"></div>

или

<div my-dir my-function="functionName()"></div>

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

то есть вместо вызова

ctrl.functionName(a,b)

Я должен позвонить

ctrl.functionName()(a,b)

Любая помощь будет принята с благодарностью.

Я видел некоторую ссылку на синтаксис следующим образом:

 <div my-dir my-function="functionName({})"></div>
Теги:
angularjs-directive
isolate-scope

2 ответа

2
Лучший ответ

HTML:

<div my-dir my-function="functionName()"></div>

директива:

angular.directive('myDir', function() {
  return {
    scope: {
      callback: '&myFunction'
    },
    controller: function($scope) {
      $scope.callback({param1: val1, param2: val2});
  };
});
  • 0
    Использование этой нотации со словарем параметров работало. Почему это необходимо? Кроме того, мне пришлось передать метод в директиву с именами аргументов
0

Попробуйте использовать следующий код с изоляцией:

angular.module("Demo", [])  
  .controller("ChildCtrl", function($rootScope, $scope) {
    $scope.testFunc = function (a, b) {
        return a + b;
    }
 })
.directive("isoElement", function() {
  return {
    restrict: "E",
    scope: {
        testFunc: '&'
    },
    link: function(scope) {
      console.log(scope.testFunc()(1, 2));
    }
  };
}); 

Использование директивы будет:

<div ng-app="Demo" ng-controller="ChildCtrl">
    <iso-element test-func="testFunc"></iso-element>
</div>

Вам нужно будет сделать scope.testFunc() (..), потому что scope.testFunc() вернет сама функция. ИМО это более понятно, чем приближаться к проблеме с другой стороны.

  • 0
    Моя проблема заключалась в том, что я не понимал, почему мне пришлось вызывать testFunc () (), когда testFunc - это функция, которая возвращает значение, а не функция. Правильный ответ, кажется, вызывает функцию из директивы этой нотации testFunc ({arg1: 1, arg2: 2})
  • 0
    В этом случае «&» передает только ссылку, а «=» передает всю функцию. Когда ссылка передается, нам нужно сначала получить саму функцию, а затем вызвать ее. С другой стороны, если мы используем «=» в изоляции области действия, тогда мы получаем саму функцию в области действия и можем просто вызвать ее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню