编辑:这个答案here似乎提供了解决方案;因为我是一个懒惰的草皮,并试图避免必须在两个地方定义我的模型(一次在服务器上,一次在客户端)我认为必须有一种方法。通过在链接解决方案中使用自定义绑定,我能够从各种表单元素数据绑定属性创建可观察对象,因此基本上它从表单构建模型。因此,它有效地从表单中推动了模型定义。我还没有决定这是不是一个坏主意:)
我想知道我做错了什么(或者确实,如果我甚至我做错了什么的话)。我需要创建一个表单来一次编辑一条记录,它只有一些简单的文本/数字属性:
{ItemCode:ABCD,LotNumber:1234,ID:4885,MeasuredValue1:90}
我决定使用ko和映射插件来完成它。我对ko很新。 无论如何,我最终得到了这样的视图模型:
var LotModel = function() {
var self = this;
self.Update = function(itemcode,lotnumber) {
var data = { ItemCode: itemcode, LotNumber: lotnumber }
//DoAjax is just a utility function and is working fine.
DoAjax("POST", "LotHistory.aspx/GetLotHistory", data,
function(msg) {
ko.mapping.fromJS(msg.d, null, self);
ko.applyBindings(self);
},
function(xhr, ajaxOptions, thrownError) {
AjaxFailure(xhr, ajaxOptions, thrownError);
}
);
}
}
稍后我的代码
var lm = new LotModel();
最后在$(document).ready
ko.applyBindings(lm);
现在它可以正常工作,除非你在视图模型中看到,每次加载数据时我都必须在vm的Update函数中重新调用 ko.applyBindings(self)。 如果我注释掉那一行,它就不会绑定。我认为这是因为我只绑定一个对象(即视图模型本身就是ko映射插件完成其工作后的对象)但是我读到的关于ko的所有地方似乎都说“你只需要打电话一次,永远。“ 所以我不禁感到我错过了一些非常明显的东西;在文档就绪函数中注释掉ko.applyBindings(lm)没有任何区别,因为我在document.ready中自动调用lm.Update,但在viewmodel中将其注释掉会破坏它。
所以我的问题是 - 我这样做是错误的吗?对于一个时间类型绑定的单个对象来说是否过度杀伤?我的意思是它不会打扰我太多,它按照我想要的方式工作,但仍然,它在唠叨我......
答案 0 :(得分:1)
如果可以避免,最好不要多次重新应用绑定。问题是您的viewmodel中没有任何可观察的属性。对ko.mapping.fromJS
的初始调用可以解决此问题(或者您可以手动添加可观察量),例如:
ko.mapping.fromJS({
ItemCode: '', LotNumber: 0, ID: 0, MeasuredValue1: 0
}, null, self);
请参阅小提琴,了解一个工作示例:http://jsfiddle.net/antishok/qpwqH/1/