Javascript 用于表示单个对象的剔除视图模型

Javascript 用于表示单个对象的剔除视图模型,javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,编辑:这个答案似乎提供了解决方案;因为我是一个懒惰的草皮,并且试图避免在两个地方(一个在服务器上,一个在客户机上)定义我的模型,所以我认为必须有一种方法。通过在链接解决方案中使用自定义绑定,我能够从各种表单元素数据绑定属性创建可观察项,因此基本上它从表单构建模型。因此,它有效地从表单中驱动模型定义。我还没有决定这是否是个坏主意:) 我想知道我做错了什么(或者说,如果我做错了什么)。我需要创建一个表单,一次编辑一条记录,该表单只包含一些简单的文本/数字属性: {ItemCode:ABCD,LotN

编辑:这个答案似乎提供了解决方案;因为我是一个懒惰的草皮,并且试图避免在两个地方(一个在服务器上,一个在客户机上)定义我的模型,所以我认为必须有一种方法。通过在链接解决方案中使用自定义绑定,我能够从各种表单元素数据绑定属性创建可观察项,因此基本上它从表单构建模型。因此,它有效地从表单中驱动模型定义。我还没有决定这是否是个坏主意:)

我想知道我做错了什么(或者说,如果我做错了什么)。我需要创建一个表单,一次编辑一条记录,该表单只包含一些简单的文本/数字属性:

{ItemCode:ABCD,LotNumber:1234,ID:4885,MeasuredValue1:90}
我决定使用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();
最后是$(文档)。准备好了吗

现在它可以工作了,只是如果您在视图模型中看到,每次加载数据时,我都必须在vm的更新函数中重新调用ko.applyBindings(self)。 如果我把那行注释掉,它就没有约束力了。我认为这是因为我只绑定了一个对象(即视图模型本身就是ko映射插件完成工作后的对象),但每当我读到关于ko的内容时,似乎都会说“你只需要调用它一次就可以了。” 所以我忍不住觉得我错过了一些非常明显的东西;在document ready函数中注释掉ko.applyBindings(lm)没有任何区别,因为我在document.ready中自动调用lm.Update,但在viewmodel中注释掉它会破坏它


所以我的问题是——我这样做是不是错了?一次只绑定一个对象是否过份了?我的意思是,它不会让我太烦恼,它可以按我希望的那样工作,但它仍然在困扰我……

如果可以避免的话,最好不要多次重新应用绑定。问题是在viewmodel中没有任何可观察的属性。对
ko.mapping.fromJS
的初始调用可以解决此问题(或者您可以手动添加可观察对象),例如:


请参阅fiddle了解工作示例:

谢谢您的帮助。提到观测不存在给了我一个很大的线索。我们在这里找到了可能的解决办法。
ko.applyBindings(lm);
ko.mapping.fromJS({
    ItemCode: '', LotNumber: 0, ID: 0, MeasuredValue1: 0
  }, null, self);