2012-06-04 47 views
2

我目前成功地使用knockout.js來處理我的應用程序中的所有數據綁定。然而,在每個頁面加載,在我的document.ready我做這樣的初始asnychronous數據加載:knockout.js加載表單到viewModel

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

但是,是否有可能代替,將數據加載到一個表單(使用ASP.NET MVC2),然後將數據反向加載到基於數據綁定標籤的視圖模型中?

我覺得這不起作用,我只是想確認我沒有做任何不當的事情。

回答

3

'value'綁定最初將元素的值設置爲您的視圖模型中的值,因此不會。但是,您可能可以將「值」綁定的代碼複製到您自己的處理程序中,該處理程序最初會根據控件上的值設置模型值。下載淘汰賽debug version,尋找ko.bindingHandlers['value'] = {上線2182拷貝裝訂處理程序聲明和變化「價值」別的東西,然後在初始化的末尾添加到valueUpdateHandler()的調用:

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

現在當您使用myvalue的結合,你的模型將與控制值進行更新時,最初的約束:

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

另外,您可以調用原始值,而不是複製所有的代碼,剛剛從valueUpdateHandler後添加代碼初始化:

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); 
    } 
}; 

如果你不希望使用AJAX,你總是可以通過序列化模型爲JSON(剃刀語法)得到的值轉換爲JavaScript:這裏

<script type="text/javascript"> 
var model = @(new HtmlString(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))); 
</script> 
+0

最後一部分是我一直在尋找確切的答案。這很好。當然,將它包含在我的直接aspx文件中,然後從外部JS文件中引用它是有點遺憾的,但是,這正是我所尋找的。謝謝! –