Ich habe eine Direktive, die mit Box file picker interagiert. Meine Anweisung wird von zwei separaten Controllern verwendet, mit der Möglichkeit, in Zukunft weitere hinzuzufügen.Angular Directive Bind-Funktion mit & nicht übergeben Argumente zum Controller
Box Dateiauswahl können Sie eine Callback-Funktion gesetzt, sobald der Benutzer eine Datei/Ordner auswählt, wie folgt aus:
var boxSelect = new BoxSelect();
// Register a success callback handler
boxSelect.success(function(response) {
console.log(response);
});
Meine Controller die Richtlinie verwenden und sie haben den Erfolg Callback-Logik als Rahmen Variablen, die Ich gehe zur Richtlinie über.
habe ich eine plunkr, wo ich die Box wählen Verhalten bin spöttischen
-Controller
.controller('myController', function($scope) {
$scope.onSuccessful = function(message) {
alert('Success! Message: ' + message);
};
})
Richtlinie
angular.module('myApp', [])
.controller('myController', function($scope) {
$scope.onSuccessful = function(message) {
//message is undefined here
alert('Success! Message: ' + message);
};
})
.directive('myDirective', function() {
return {
restrict: 'A',
scope: {
success: '&'
},
link: function(scope, element) {
//third party allows to subscribe to success and failure functions
function ThirdPartySelect() {
}
ThirdPartySelect.prototype.success = function(callback) {
this.callback = callback;
};
ThirdPartySelect.prototype.fireSuccess = function() {
this.callback({
foo: 'bar'
});
};
var myThirdPartyInstance = new ThirdPartySelect();
myThirdPartyInstance.success(function(message) {
//message is still defined here, but not in the controller
scope.success(message);
});
element.on('click', function() {
myThirdPartyInstance.fireSuccess();
});
}
};
});
Ansicht
<div ng-controller="myController">
<button my-directive success="onSuccessful(arg)">Test</button>
</div>
Die Callback-Funktion wird in der Steuerung, aber die Argumente genannt nicht definiert sind.
konnte ich dieses Problem beheben, indem ‚=‘ anstelle von ‚&‘, aber ich würde gerne wissen, warum es nicht mit ‚&‘ arbeitet, da es angeblich für method binding
Das Argument sehen Name mit dem in Ausdruck in html übereinstimmen sollte. Im Controller gibt es einen formalen Parameter und er kann einen beliebigen Namen haben. Es ist also nicht notwendig, param in html umzubenennen, sondern nur "arg" im Objekt anzugeben, wenn von Direktive gesendet wird. 'scope.success ({arg: message.foo});' –
Es hat funktioniert, vielen Dank!Ich konnte das in den offiziellen Dokumenten nicht finden, das scheint irgendwie kontraintuitiv zu sein, warum ließen sie mich nicht einfach eine echte Referenz auf die Funktion geben, anstatt auf eine seltsame Proxy-Funktion? – yvesmancera