2014-12-03 132 views
0

我是KnockOutJs的新手,並開發一個使用KnockOutJs維護客戶端模型狀態和Asp.Net Webforms的頁面。 當我從服務器請求一個頁面時,控件(如文本框,跨度)已經被Asp.Net代碼填充。KnockoutJs applyBindings清除由Asp.net設置的默認值Webforms

<asp:TextBox runat="server" class="form-control" text="John" data-bind="value: firstName" id="txtFirstName"></asp:TextBox> 
在我的JavaScript

現在,當我定義我的視圖模型

var viewModel = { userId = ko.observable() } 
ko.applyBindings(viewModel); 

的applyBindings語句使文本框的值被重置,因爲我不是在ko.observable定義我的初始值() 。

是否有將不適用該模型DOM元素applyBindings過載而只是結合使用DOM模型或執行相反(即讀取DOM值代入模型)

+1

我現在不能做到這一點,但我懷疑一個自定義的結合可能是去這裏的路。因此,不是使用內置的'value'綁定,而是編寫自己的代碼來完成同樣的事情,但是可以從DOM中獲取初始值。如果沒有其他人,那麼明天我會試一試。 – 2014-12-03 22:43:44

+0

或者,無論您的代碼是在後面的代碼中設置文本框的值,您是否可以改變它,以便將值注入到javascript viewmodel中? – 2014-12-03 22:46:18

+0

@JamesThorpe,感謝您的指導,我會在週末嘗試這個。 – 2014-12-05 22:39:52

回答

2

最好是使用服務器端代碼來填充您的視圖模型,而不是使用服務器端代碼來填充文本框。

var viewModel = { firstName = ko.observable('<%= HttpUtility.JavaScriptStringEncode(FirstName) %>') }; 
ko.applyBindings(viewModel); 

或理想,您將創建在服務器端的模型和序列化使用json.net到JSON:

function ViewModel(model) { 
    var self = this; 

    self.firstName = ko.observable(model.FirstName); 
}; 

var model = <%= JsonConvert.SerializeObject(Model) %>; 
var viewModel = new ViewModel(model); 
ko.applyBindings(viewModel);