【问题标题】:knockout view model to represent a single object剔除视图模型以表示单个对象
【发布时间】:2013-01-08 14:24:35
【问题描述】:

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

我想知道我做错了什么(或者实际上,如果我什至 am 做错了什么)。我需要创建一个表单来一次编辑一条记录,它只有一些简单的文本/数字属性:

{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 的更新函数中重新调用 ko.applyBindings(self)。 如果我注释掉该行,它不会绑定。我认为这是因为我只绑定了一个对象(即视图模型本身是 ko 映射插件完成其工作之后的对象),但在我读到关于 ko 的所有地方,它似乎都在说“你只需要调用一次,永远。” 所以我不禁觉得我错过了一些非常明显的东西;在文档就绪函数中注释掉 ko.applyBindings(lm) 没有任何区别,因为我在 document.ready 中自动调用 lm.Update 但在视图模型中注释掉它会破坏它。

所以我的问题是 - 我这样做是错误的吗?一次类型绑定只处理一个对象是否过大?我的意思是它不会太困扰我,它可以按我的意愿工作,但它仍然在唠叨我......

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin


    【解决方案1】:

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

    ko.mapping.fromJS({
        ItemCode: '', LotNumber: 0, ID: 0, MeasuredValue1: 0
      }, null, self);
    

    查看 fiddle 以获取工作示例:http://jsfiddle.net/antishok/qpwqH/1/

    【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    相关资源
    最近更新 更多