wake-up-neo.com

Übergabe von Argumenten an den ngChange-Ereignisaufruf von inside

Ich habe eine Direktive, die ein ng-change-Attribut akzeptiert:

<radio-buttons options="optionsList" 
               ng-model="myModel" 
               ng-change="myCallback($event)"></radio-buttons>

Ich habe in meinem Controller eine Funktion definiert, myCallback, die wie folgt aussieht:

$scope.myCallback = function(e) {
    console.log("Callback from controller");   
    console.log(e);
}

Die folgende Funktion select ist in meiner radioButton-Direktive vorhanden. Ich muss definieren, wann der ngChange-Callback in meiner Direktive in der select-Funktion ausgeführt wird:

function select(scope, val) {
    if (!scope.disabled && scope.selectedValue != val) {
        scope.selectedValue = val;
        scope.model = val;

        scope.callback.call();
    }
}

Das Problem, das ich habe, ist das Argument $event in myCallback, das nicht weitergegeben wird, wenn ich myCallback in der select-Funktion meiner Direktive ausführt.

Geige: http://jsfiddle.net/dkrotts/BtrZH/7/ Aktualisiert: http://jsfiddle.net/dkrotts/BtrZH/8/

Was mache ich falsch?

13
Dustin

Wenn Sie steuern möchten, wann Ihr Handler für die ng-change aufgerufen wird, denke ich, der einfachste Weg wäre, die ng-change vollständig zu entfernen. Sie können die Controller-Funktion direkt von Ihrem ng-click-Rückruf aus aufrufen.

Ich denke, das erreicht Ihre gewünschte Funktionalität:

http://jsfiddle.net/BtrZH/11/

Sie können das Ereignisobjekt bei Bedarf mit einem Klick erfassen:

ng-click="select(scope, option.value, $event)"

Dann können Sie die Controller-Funktion auf Wunsch aufrufen:

function select(scope, val, $event) {
    if (!scope.disabled && scope.selectedValue != val) {
        scope.selectedValue = val;
        scope.model = val;
        scope.$parent.myCallback($event);
    }
}
4
Alex Osborn

Sie müssen den Parameter im Callback wie folgt übergeben:

callback({parametername: value});

Und Sie müssen den Parameternamen mit dem inHTMLdeklarierten übereinstimmen.

In Ihrem Fall: 

callback({$event: val})
4

Folgendes sieht nicht gut aus, würde aber funktionieren (es würde eine weitere Variable $event erstellen und diese über ng-change übergeben):

ng-click="$event = $event" ng-change="myCallback($event)"
2
John Doe

Um Werte an Ihren Controller zu übergeben, rufen Sie ihn mit einem Objekt mit Schlüsseln auf, die den in Ihrer Vorlage definierten Empfängerargumenten entsprechen.

z.B.

element

<my-element change="myFunction(value, id, event)"></my-element>

anrufer

{
   "restrict" : ...,
   "scope" : {
       "change" : "&"
    },
   "controller" : function($scope){
       this.someEventHandler = function($event){

          // called here
          scope.change({
              "value" : "somevalue",
              "id" : "someid",
              "event" : $event
          });

       }
   }
}

übergeordneter Controller-Empfänger

$scope.myFunction = function(v, i, e){
   // do stuff
}

REF: Argumente an den ngChange-Ereignisaufruf von Direktive aus übergeben

1
Nate Bosscher