使用knockout.js在viewmodel中使用实体

时间:2011-12-10 18:01:25

标签: jquery knockout.js

我正在学习knockout.js。我有一个基本的网页,允许用户添加和编辑实体。为了避免重复,我想在视图模型中定义实体的实例,就像在Silverlight中可以做的那样。

<input id="orderQuantity" type="text" data-bind="value:order.quantity" />
<input id="orderPrice" type="text" data-bind="value:order.price" />
<select id="orderType" data-bind="options:orderTypes">

var viewModel = {
  order: ko.observable(null),
  orderTypes: ko.observableArray(['Priority', 'Express', 'Normal' ]),

  init: function(o) {
    // Determine if we're working with an existing order, or a new one.
    if (o == null) {
      this.order(null);
    }
    else {
      this.order(new order(o));
    }
  }
};

$().ready(function () {
    ko.applyBindings(viewModel);
});

// The following is defined in a seperate .js file. 
// I've verified its getting called by using an 'alert'
var order = function(o) {
  this.id = o.id;
  this.quantity = o.quantity;
  this.price = o.price;
  this.orderType = o.orderType;
}

我的问题是当我打电话给init时,我注意到订单已经创建了。但是,与订单关联的值不会绑定在表单元素中。如何使这个表格有效?我想菊花链,以便我可以保持我的类定义分开,以便我可以重复使用它们。

谢谢!

1 个答案:

答案 0 :(得分:1)

不确定这是否是最适合您的解决方案,但我在http://jsfiddle.net/photo_tom/vcu67/1/工作。

有两个问题 -

  1. 通过命令ko.observable,你的引用需要是order()。数量,没有order.quantity就像你有。当您将订单作为一个可观察的订单时,您必须将其作为一个函数引用。
  2. 我会改变你的数据模型,就像我在小提琴中一样。在您的示例中,由于Order模型中的每个对象都不是可观察的,因此屏幕上的更新不会反映在数据模型中。
  3. 希望这符合您的需求