2016-07-06 13 views
0

Ich mag verbindlich Kontext der Lage sein, einen verbindlichen Rahmen zu schaffen, indem auf eine Eigenschaft zu binden, in ähnlicher Weise, wie die with Bindung Werke:Satz auf eine Eigenschaft

<div data-bind="with: myData"> 
     <button data-bind="text: myHeader"></button> 
</div> 

Aber ich will nicht verwenden, with, weil es die HTML-Elemente (die button in meinem Beispiel) jedes Mal myData Änderungen neu erstellt, siehe http://knockoutjs.com/documentation/with-binding.html:

Wenn der Ausdruck Sie beobachtbaren Werte beinhaltet liefern, der Ausdruck wird w neu bewertet werden hegen Sie nie eine dieser Observablen ändern. Dann werden die untergeordneten Elemente gelöscht und eine neue Kopie des Markups wird Ihrem Dokument hinzugefügt und im Kontext des neuen Bewertungsergebnisses gebunden.

Also muss ich etwas Ähnliches wie with Bindung, werfen wir einen context sagen Bindung:

<div data-bind="context: myData"> 
     <button data-bind="text: myHeader"></button> 
</div> 

<button> nun dem myData Kontext gebunden ist, so habe ich nicht schreiben:

<div> 
     <button data-bind="text: myData().myHeader"></button> 
</div> 

Dies wird auch in http://www.knockmeout.net/2012/03/knockoutjs-performance-gotcha-1ifwith.html

beschrieben

Die mit Bindung ist sehr praktisch für die Bindung gegen verschachtelte Objekte/Modelle und hilft, Ihre Daten zu binden Attribute von werden zu ausführlich. Es ist jedoch wichtig zu verstehen, dass der mit Bindung den gesamten Abschnitt erneut rendert, wenn sich sein gebundener Wert ändert.

Gibt es so etwas in KO?

Antwort

-1

Ich glaube nicht, dass Zitat aus den Dokumenten bedeutet, was Sie denken, dass es tut.

Wenn Observablen in dem Objekt, das Sie in den with Bindung verwenden, und diese Observablen ändern, dann wird der Körper des Elements, das die die with Bindung hat bedingungslos nicht neu gerendert werden.

Versuchen Sie es. Führen Sie dieses Snippet und geben Sie in das Eingabeelement, während die Zählerinkrementierungen:

var vm = { 
 
    sample: { 
 
    counter: ko.observable(0) 
 
    } 
 
}; 
 

 
ko.applyBindings(vm); 
 

 
setInterval(function() { 
 
    vm.sample.counter(vm.sample.counter() + 1); 
 
}, 1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<div data-bind="with: sample"> 
 
    <input type="text" value="type here"> 
 
    <div>Counter: <span data-bind="text: counter"></span><div> 
 
</div>

Was die Dokumentation bedeutet: Wenn die with Bindungsstellen zu einer beobachtbaren und dass beobachtbaren Veränderungen, dann ist die Der Körper des Elements wird erneut gerendert.

"Wenn der von Ihnen angegebene Ausdruck irgendwelche beobachtbaren Werte enthält, bezieht sich" auf den Ausdruck, den Sie der with-Bindung geben. In Ihrem Fall ist dieser Ausdruck ein einzelner Wert, myData.Ob es irgendwelche Observablen gibt innerhalb vonmyData ist völlig irrelevant.