如果数据绑定对象只有名称,那么淘汰赛如何知道?

时间:2016-03-31 13:52:59

标签: javascript knockout.js data-binding

我有类似的东西:

<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开发人员所以在我的脑海里采取一些事情&#34;名字&#34;不清楚。或者我错了,这是以名字命名的?我阅读了文档,但是我仍然没有理解如何将模板gift()与模型中名为gift的数组连接起来?

但这是来自淘汰主页的样本。

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

1 个答案:

答案 0 :(得分:1)

  

如何发生ko.applyBindings(viewModel);是否神奇地按变量名称进行招标?是淘汰赛以某种方式搜索它的名字?

在这里削减一些角落,但Javascript(不是那么多KO)与.NET有两个不同之处,与你的问题有关:

  • 也可以访问所有成员(例如$output),就好像self.gifts有一个基于字符串的索引器来获取它们(例如self);
  • Javascript是动态类型的,因此self['gifts']在运行时可以包含一个数组,字符串,observable:whatever。

因此,Knockout可以使用你的字符串self['gifts']来使用它来获取变量"gifts"并在运行时检查它的类型以查看它是否是一个数组,可观察的y / n等,以及相应地选择适当的代码路径。

至于你的另一个问题:

  

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

Knockout是开源的(虽然在开始使用JS时可能不容易阅读),如果你深入研究它,你会发现foreach assumes it's passed an array