我正在学习 KO 并尝试创建一个简单的列表项添加/删除。但我有以下问题。
Q1:如果您点击添加而不输入名称,您刚刚添加的项目将具有result
名称。为什么以及如何在允许空作为有效输入的同时防止它?
Q2:我想使用<pre>
标签显示当前视图模型的 JSON,但它没有显示任何内容。但是按钮显示了一些东西。我想出了这个。我需要使用ko.toJSON($data, null, 4)
.
Q3:和Q2有关,按钮显示了一些东西,但是显示的东西看起来很奇怪。输入几个项目后,然后单击debug
按钮。您将看到视图模型中的所有项目都被您更改的最后一项替换。
这是小提琴。
CSS:
input[type=text], select {
width:100px;
}
JS:
function foodie() {
this.name;
this.food;
}
function foodieApp() {
var self = this;
self.foodies = ko.observableArray();
self.foodieToAdd = ko.observable(new foodie());
self.addFoodie = function () {
this.foodies.push(this.foodieToAdd());
};
self.delFoodie = function (foodieToDel) {
self.foodies.remove(foodieToDel);
};
self.debug = function () {
alert(ko.toJSON(self, null, 4));
};
}
var app = new foodieApp();
ko.applyBindings(app);
HTML:
<table>
<thead>
<tr>
<td>Foodie's Name
<br/>
<input type=text data-bind='value: foodieToAdd().name' />
</td>
<td>Foodie's Food
<br/>
<select data-bind='value: foodieToAdd().food'>
<option value=apple>Apple</option>
<option value=banana>Banana</option>
<option value=cherry>Cherry</option>
</select>
</td>
<td>
<input type=button value=Add data-bind='click: addFoodie' />
</td>
</tr>
</thead>
<tbody data-bind='foreach: foodies'>
<tr>
<td>
<input type=text data-bind='value: name' />
</td>
<td>
<select data-bind='value: food'>
<option value=apple data-bind>Apple</option>
<option value=banana>Banana</option>
<option value=cherry>Cherry</option>
</select>
</td>
<td>
<input type=button value=del data-bind='click: $parent.delFoodie' />
</td>
</tr>
</tbody>
</table>
<input type=button value=debug data-bind='click: debug' />
<!-- why the following <pre> tag is empty? -->
<pre data-bind='text: ko.toJSON(app, null, 4)'></pre>