我有类似的东西:

<form action='/someServerSideHandler'>
  <p>You have asked for <span data-bind='text: gifts().length'>&nbsp;</span> gift(s)</p>
  <table data-bind='visible: gifts().length > 0'>
    <thead>
      <tr>
        <th>Gift name</th>
        <th>Price</th>
        <th />
      </tr>
    </thead>
    <tbody data-bind='foreach: gifts'>
      <tr>
        <td><input class='required' data-bind='value: name, uniqueName: true' /></td>
        <td><input class='required number' data-bind='value: price, uniqueName: true' /></td>
        <td><a href='#' data-bind='click: $root.removeGift'>Delete</a></td>
      </tr>
    </tbody>
  </table>

  <button data-bind='click: addGift'>Add Gift</button>
  <button data-bind='enable: gifts().length > 0' type='submit'>Submit</button>
</form>




var GiftModel = function(gifts) {
var self = this;
self.gifts = ko.observableArray(gifts);

self.addGift = function() {
  self.gifts.push({
    name: "",
    price: ""
  });
};

self.removeGift = function(gift) {
  self.gifts.remove(gift);
};

self.save = function(form) {
  alert("Could now transmit to server: " + ko.utils.stringifyJson(self.gifts));
  // To actually transmit to server as a regular form post, write this: ko.utils.postJson($("form")[0], self.gifts);
};
};

var viewModel = new GiftModel([
    { name: "Tall Hat", price: "39.95"},
    { name: "Long Cloak", price: "120.00"}
]);
ko.applyBindings(viewModel);

// Activate jQuery Validation
$("form").validate({ submitHandler: viewModel.save });


ko.applyBindings(viewModel);通过变量名神奇地进行出价的情况如何?淘汰赛是按名称搜索吗?模板如何知道这是他的数组/数据集?我基本上是.net开发人员,因此在我看来“取名”尚不清楚。还是我以为这个名字是错误的?我阅读了文档,但仍然不了解如何从模型中将模板gifts()与命名为礼品的数组连接在一起?

但这是来自淘汰赛主页的示例。

http://knockoutjs.com/examples/gridEditor.html

最佳答案

ko.applyBindings(viewModel)是怎么回事?用变量名神奇地出价吗?淘汰赛是按名称搜索吗?


在这里有所作为,但是与您的问题相关的Javascript(不是很大的KO)与.NET有两点不同:


也可以访问所有成员(例如self.gifts),就像self拥有基于字符串的索引器来获取它们(例如self['gifts'])一样;
Javascript是动态类型的,因此self['gifts']可以在运行时包含可观察的数组,字符串,任意值。


因此,Knockout可以将字符串"gifts"用于字符串self["gifts"],并在运行时检查其类型,以查看其是否为数组,可观察的y / n等,并相应地选择适当的代码路径。

至于您的其他问题:


  模板如何知道这是他的数组/数据集?


Knockout是开源的(尽管从JS开始时可能不容易阅读),如果您深入了解它,则会发现foreach assumes it's passed an array

09-25 18:04