2016-04-19 3 views
3

Bei der Suche nach Informationen über Angular Richtlinien und vorbei Verhalten Richtlinien, bekomme ich auf einem Isolat Umfang in Richtung des Verfahrens zeigte endete als verbindlich, dhRichtige "eckige" Art und Weise, das Verhalten an die Richtlinie zu übergeben?

scope: { 
    something: '&' 
} 

Die documentation für diese Funktionalität ein wenig verwirrend ist, und ich glaube nicht, dass es enden wird, was ich will.

Ich endete mit diesem Schnipsel (vereinfacht für die Kürze), das funktioniert, indem es eine Bereichsfunktion in HomeCtrl übergeben, und die Richtlinie funktioniert und ruft die Funktion auf. (Nur wenn es wichtig ist, gibt der echte Code ein Versprechen aus der Direktive zurück).

angular.module('app', []); 
 

 
angular.module('app') 
 
    .directive('passingFunction', 
 
    function() { 
 
     var changeFn, 
 
     bump = function() { 
 
      console.log('bump() called'); 
 
      internalValue++; 
 
      (changeFn || Function.prototype)(internalValue); 
 
     }, 
 
     internalValue = 42; 
 

 
     return { 
 
     template: '<button ng-click="bump()">Click me!</button>', 
 
     scope: { 
 
      onChange: '<' 
 
     }, 
 
     link: function(scope, element, attrs) { 
 
      if (angular.isFunction(scope.onChange)) { 
 
      changeFn = scope.onChange; 
 
      } 
 

 
      scope.bump = bump; 
 
     } 
 
     }; 
 
    }) 
 
    .controller('HomeCtrl', 
 
    function($scope) { 
 
     $scope.receive = function(value) { 
 
     console.log('receive() called'); 
 
     $scope.receivedData = value; 
 
     }; 
 
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.4/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="HomeCtrl"> 
 
    <passing-function on-change="receive"></passing-function> 
 
    <p>Data from directive: {{receivedData}}</p> 
 
</div>

Ist das eine richtige "Angular" Art und Weise, dies zu erreichen? Dies scheint zu funktionieren.

+0

tun Sie in der Steuerung eine benutzerdefinierte Funktion durch den HTML-Code auf feuern wollen, aber ausgelöst durch die Direktive ng-click? Warum verwenden Sie keine Ereignisse und lassen den Controller die Ausführung der Funktion auflösen? –

+0

Ich brauche die Direktive, um eine beliebige Funktion aufrufen zu können. Die echte Anweisung soll eine Suchfunktionalität umschließen, die Funktionen enthält, um Benutzereingaben zu akzeptieren, einen Suchserver aufzurufen und Ergebnisse zu erhalten, aber das einzige, was der Controller interessieren soll, sind Ergebnisse aus der Suche. Letztendlich versuche ich, die Suchergebnisse (im vereinfachten Beispiel oben, der 'interneWert') an den Controller zu übergeben. In Bezug darauf, warum keine Ereignisse verwendet werden, ist das der Grund für die Frage ... wenn es einen besseren Weg gibt, würde ich diesen besseren Weg lieber verwenden. – jdphenix

Antwort

1

Sie müssen die Funktion an die Direktive übergeben. Ich werde ein sehr kleines Beispiel machen.

On-Controller:

$scope.thisFn = thisFn(data) { console.log(data); }; 

In html:

<my-directive passed-fn="thisFn()"></my-directive> 

Auf Anweisung:

.directive('myDirective', [ 
() => { 
    return { 
     restrict: 'E', 
     scope: { 
     passFn: '&' 
     }, 
     template: '<div id="myDiv" ng-click="passFn(data)"></div>', 
     link: (scope) => { 
      scope.data = "test"; 
     } 
    } 
    }]); 
+0

Ich konnte so weit kommen, aber wie rufe ich dann 'passedFn()' in einem Objekt, das im Rahmen der Factory-Funktion der Richtlinie übergeben? – jdphenix

+0

Ich bin mir nicht sicher, ob ich 100% weiß, was du meinst, aber ich habe meinen Code aktualisiert, um zu reflektieren, was ich * glaube * du meinst. –