7

Widziałem wiele z tych pytań, ale nie znalazłem rozwiązania, które działa. tutaj jest skrzypce, które nie działa, ale powinno.Przekaż argumenty od dyrektywy do funkcji kontrolera

http://jsfiddle.net/cdparmeter/j2K7N/2/

Kontroler:

$scope.foo = function (textArray) { 
    console.log(textArray) 
}; 

dyrektywa:

return { 
    restrict: 'E', 
    replace: 'true', 
    scope: { 
     methodToCall: '&method' 
    }, 
    template: "<div> 
     <input ng-model='textToPush'/> 
     <button ng-click='pushText'>Push</button> 
     <button ng-click='finish'>Finish</button> 
    </div>", 
    link: function (scope, element, attrs) { 
     scope.paragraphs = []; 
     scope.pushText = function() { 
      scope.paragraphs.push(scope.pushText); 
      scope.pushText = ""; 
     } 
     scope.finish = function() { 
      scope.methodToCall(scope.paragraphs) 
     } 
    } 
} 

HTML:

<div ng-app="MyApp"> 
    <div ng-controller="MyController"> 
     <container data-method="foo"> 
    </div> 
</div> 

buduję tablicę wewnątrz mojego dyrektywy, który wymaga niestandardowego ha ndling w kontrolerze zakresu nadrzędnego. Wiem, że mogę rzucić zegarek w zakresie nadrzędnym na modelu, który przechodzę do mojej dyrektywy, ale to wydaje się hackowe i brudne. jakieś sugestie?

Odpowiedz

12

Zanim odpowiem na Twoje pytanie muszę powiedzieć, że skrypt zawiera kilka błędów:

  1. Ty wiążącą wejście do zmiennej o nazwie textToPush, a następnie używając innego jeden wewnątrz funkcji pushText (pushText) ;
  2. Nie ustawiasz prawidłowo dyrektywy ng-click; powinno być ng-click="pushText()" zamiast ng-click="pushText". To samo dla finish;

Teraz wracam do pytania. W celu wywołania funkcji z zakresu dominującej przechodzącej argumenty, można uzyskać odniesienie do pierwszego tej funkcji, a następnie uruchomić go:

scope.finish = function() { 
    var func = scope.methodToCall();     
    func(scope.paragraphs); 
} 

Oto working version swojego skryptu.

Można też to zrobić, jeśli wolisz:

scope.finish = function() { 
    scope.methodToCall({value: scope.paragraphs});         
} 

Ale dla tego kodu do pracy należy zmienić znaczników do:

<container data-method="foo(value)"/> 

Oto another jsFiddle przedstawiający rozwiązanie powyżej.

Powiązane problemy