我有类似的东西:
<form action='/someServerSideHandler'>
<p>You have asked for <span data-bind='text: gifts().length'> </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的数组连接起来?
但这是来自淘汰主页的样本。
答案 0 :(得分:1)
如何发生ko.applyBindings(viewModel);是否神奇地按变量名称进行招标?是淘汰赛以某种方式搜索它的名字?
在这里削减一些角落,但Javascript(不是那么多KO)与.NET有两个不同之处,与你的问题有关:
$output
),就好像self.gifts
有一个基于字符串的索引器来获取它们(例如self
); self['gifts']
在运行时可以包含一个数组,字符串,observable:whatever。因此,Knockout可以使用你的字符串self['gifts']
来使用它来获取变量"gifts"
并在运行时检查它的类型以查看它是否是一个数组,可观察的y / n等,以及相应地选择适当的代码路径。
至于你的另一个问题:
模板如何知道这是他的数组/数据集?
Knockout是开源的(虽然在开始使用JS时可能不容易阅读),如果你深入研究它,你会发现foreach
assumes it's passed an array。