2013-04-21 3 views
19

Как директива может вызвать функцию от контроллера с некоторыми параметрами?Вызов функции контроллера из директивы с параметрами

Я хотел бы указать переменную myVar в область. $ Apply (attrs.whattodo);

HTML:

<div ng-app="component"> 
    <div ng-controller="ctrl"> 
    <span ng-repeat="i in myarray"> 
    <span customattr whattodo="addVal">{{i}}</span> 
    </span> 
    </div> 

Контроллер JS:

function ctrl($scope) { 
     $scope.myarray = [1]; 
     $scope.addVal = function (value) { 
      $scope.myarray.push(value); 
     } 
    } 

Директива JS:

angular.module('component', []).directive('customattr', function() { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      var myVar = 5; 
      scope.$apply(attrs.whattodo); 
     } 
    }; 
}); 

ответ

17

Вот один из методов работы:

Вы должны связать этот атрибут в сферу как модель рамки с типом функции. Таким образом, вы можете выполнить это, когда вам нужно в другой (директивы) SOPE

HTML

<body ng-controller="MainCtrl"> 
    Value: {{value}}! 

    <button customattr whattodo="addValue">Add</button> 
</body> 

JS

angular.module('component', []) 

.controller('MainCtrl', function($scope) { 
    $scope.value = 1; 

    $scope.addValue = function(val){ 
    alert(val); 
    $scope.value = val; 
    } 
}); 

.directive('customattr', function() { 
    return { 
     restrict: 'A', 
     scope: { 
      whattodo: "=" // or ' someOtherScopeName: "=whattodo" ' 
     }, 
     link: function (scope, element, attrs) { 
      var myVar = 5; 
      scope.whattodo(myVar); // or ' scope.someOtherScopeName(myVar) ' 
     } 
    }; 
}); 

Вот code on plunker

fromAngularJS: Directives

= or =attr - set up bi-directional binding between a local scope property and the parent scope property of name defined via the value of the attr attribute. If no attr name is specified then the attribute name is assumed to be the same as the local name. Given and widget definition of scope: { localModel:'=myAttr' }, then widget scope property localModel will reflect the value of parentModel on the parent scope. Any changes to parentModel will be reflected in localModel and any changes in localModel will reflect in parentModel

+0

Это великолепно работает. Последнее: пример, который я дал, был тупой. Но с моим «реальным» примером: значение представляет собой список dicts, который я визуализую с помощью некоторого входного текста. Если я поместил пустую область или область, которую вы дали, все поля ввода пустуют. Любая идея почему?Спасибо – JohnCastle

+0

Честно трудно представить это, не сложно ли вам переместить ваш настоящий образ в плункер? Спасибо – Maksym

+0

Конечно! Вот он: http://plnkr.co/edit/mu9DM1dEyZ36UqVvw0DM Просто поставьте область действия true в директиве, и вы увидите в ней «Toto». Или – JohnCastle

10

в HTML

whattodo="addVal(value)" 

в директиве

scope.$apply(function(s){ 
    s.whattodo({value : myVar}); 
}); 
+0

я получил: TypeError: Property 'whattodo' объекта # не является функцией? – JohnCastle

+0

извините. я исправил его. должен был быть s.whattodo – Ketan

+0

Очень интересно и хорошо работает ([demo] (http://jsfiddle.net/BinaryMuse/rhXDs/)). После некоторой мысли, то же самое должно использоваться в таких вещах, как '

2

Почему бы вам не использовать знак «&» в изолированном объеме?

<body ng-controller="MainCtrl"> 
    Value: {{value}}! 
    <button customattr add-val="addValue(value)">Add</button> 
</body> 

В контроллере:

function ctrl($scope) { 
     $scope.myarray = [1]; 
     $scope.addValue = function (value) { 
      $scope.myarray.push(value); 
     } 
    } 

И в директиве:

angular.module('component', []).directive('customattr', function() { 
    return { 
     restrict: 'A', 
     scope: { 
      addVal: "&" 
     }, 
     controller: function ($scope) { 
      var myVar = 5; 
      // To execute addVal in controller with 'value' param 
      $scope.addVal({value: value}) 
     } 
    }; 
}); 
+1

в директиве, где вы когда-либо использовали addVal, вместо этого используйте whattodo – userRaj

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