2017-03-16 5 views
0

Ich bin verwirrt, wie die Parameter in die Funktion aus dem HTML übergeben werden.Knockout Klick Bindung mit mehreren Parametern

<tbody data-bind="foreach: colorItem"> 
    <tr> 
     <td data-bind="click: $root.colorTest.bind($data, 'red', 'blue'), text: 'color'"></td> 
    </tr> 
</tbody> 


public colorTest(data, param1, param2) { 
    if (param1 == 'red'){ 
     // do something 
    } 

In der Colortest-Funktion, ich erwarte, dass ‚Daten‘ $ data und ‚param1‘ zu halten, den Wert ‚rot‘ und ‚param2‘ zu halten, den Wert ‚blau‘ zu halten.

Allerdings werden $ Daten immer in das letzte Parameterfeld übernommen. Also in der colorTest-Funktion, Daten = 'rot', param1 = 'blau', param2 = '$ data'.

Funktioniert das Knockout? $ data wird immer als letzter Parameter in eine Funktion übergeben, auch wenn sie als erstes in der HTML-Datenbindung steht?

Antwort

2

Die .bind-Funktion ist kein Teil von knockout, es ist eine JavaScript-Funktion, und der erste Parameter soll immer der "dies" -Kontext sein. Es werden also nur die Parameter nach dem ersten als Argumente übergeben. Reference

sollten Sie ändern Ihre Bindung wie folgt:

click: $root.colorTest.bind($root, $data, 'red', 'blue') 

Knockout ruft die Funktion mit Daten $ und $ Ereignis, das nach den gebundenen Argumente übergeben bekommen.

+0

danke. Das funktioniert. Aber brauche ich $ Daten explizit zu übergeben? Wie Sie sagen, sendet Knockout automatisch $ data und $ event nach den gebundenen Argumenten (ich habe das gesehen). Sendet es $ Daten zweimal? Wäre es besser, "... colorTest.bind ($ root, 'red', 'blue') zu verwenden und dann die $ data mit dem dritten Parameter in meiner Funktion zu erfassen, so dass es wie folgt aussieht: public colorTest (param1, param2 , Daten) "? – nanonerd

+0

Ja, das sollte auch funktionieren. –