我有类似的东西:
<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开发人员,因此在我看来“取名”尚不清楚。还是我以为这个名字是错误的?我阅读了文档,但仍然不了解如何从模型中将模板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。