2014-12-03 131 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);