forma de încărcare knockout.js în modelul de vizualizare

În prezent, folosesc cu succes knockout.js pentru a gestiona toate legăturile mele de date în aplicația mea. Cu toate acestea, la încărcarea fiecărei pagini, în document.ready meu fac o încărcare de date asnaminos inițială, astfel:

$(document).ready() {
  getData()
});

Cu toate acestea, este posibil ca, în schimb, să încărcați datele într-o formă (folosind ASV.NET MVC2) și apoi să inversați încărcarea datelor în modelul de vizualizare pe baza etichetelor de legare a datelor?

Mă simt ca acest lucru nu merge, vreau doar să confirm că nu fac nimic impropriu.

0

2 răspunsuri

Legarea "valoare" stabilește inițial valoarea elementului la cea din modelul dvs. de vizualizare, deci nu. Cu toate acestea, este posibil să duplicați codul pentru legarea "valoare" în propriul handler, care stabilește inițial valorile modelului de la valorile din controale. Descărcați versiunea de depanare a knockout-ului și arătați pentru ko.bindingHandlers ['value'] = { pe linia 2182. Copiați această declarație a handlerului obligatoriu și schimbați 'value' la altceva, apoi adăugați un apel la valueUpdateHandler

ko.bindingHandlers['myvalue'] = {
    'init': function (element, valueAccessor, allBindingsAccessor) {
       //skipping code
        valueUpdateHandler();//update model with control values
    },
    'update': function (element, valueAccessor) {
       //skipping code
    }
};

Acum, atunci când utilizați legarea mivalue, modelul dvs. va fi actualizat cu valorile de control când obligați inițial:

<input type="text" data-bind="myvalue: name">

Alternativ, ați putea să apelați valorile inițiale în loc să copiați întregul cod și să adăugați codul din valoareaUpdateHandler după init:

ko.bindingHandlers['myvalue'] = {
    'init': function (element, valueAccessor, allBindingsAccessor) {
       //call existing value init code
        ko.bindingHandlers['value'].init(element, valueAccessor, allBindingsAccessor);

       //valueUpdateHandler() code
        var modelValue = valueAccessor();
        var elementValue = ko.selectExtensions.readValue(element);
        ko.jsonExpressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'value', elementValue, /* checkIfDifferent: */ true);
    },
    'update': function (element, valueAccessor) {
       //call existing value update code
        ko.bindingHandlers['value'].update(element, valueAccessor);
    }
};

Dacă nu doriți să utilizați AJAX, puteți obține întotdeauna valorile în JavaScript serializând modelul dvs. ca JSON (sintaxă razor):

<script type="text/javascript">
var model = @(new HtmlString(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model)));
</script>
0
adăugat
Ultima parte a fost răspunsul exact pe care îl căutam. Acest lucru este excelent. Desigur, este un pic cam rușine să trebuiască să includem acest lucru în fișierul meu aspx direct și apoi să îl menționez dintr-un fișier extern JS, dar totuși, acesta era ceea ce căutam. Mulțumiri!
adăugat autor Adam Levitt, sursa

Există un exemplu de lucru aici (nu al meu) cu câteva moduri diferite de a realiza acest lucru:

http://jsfiddle.net/rniemeyer/5Z2SC/

0
adăugat