【发布时间】:2013-07-09 20:40:50
【问题描述】:
目标
使用 KnockoutJS 从外部 observableArray 中删除项目。
问题
我的应用程序中有两个observableArray。一种是可供购买的产品,另一种是我通过单击add button 在摘要中添加的产品。
到这里为止,一切正常。但现在我需要从 Summary 中删除项目并更改按钮状态/样式 - 我不知道如何访问外部 observableArray 来执行此操作。
要了解我的问题,请查看this jsFiddle 或查看下一个主题中的标记。
如您所见,当我单击add button 时,产品会转到摘要。当我单击删除时——无论按钮是来自摘要还是产品——我都想更改按钮状态并从摘要中删除该项目。从技术上讲,我想使用products' observableArray 从items' observableArray 中删除该项目。
我的代码
HTML:
<ul class="summary">
<!-- ko foreach: Summary.items -->
<p data-bind="text: name"></p>
<button class="btn btn-danger btn-mini remove-item">
<i class="icon-remove">×</i>
</button>
<!-- /ko -->
</ul>
<h1>What would you to buy?</h1>
<ul class="products">
<!-- ko foreach: Product.products -->
<li>
<h3 data-bind="text: name"></h3>
<p data-bind="text: desc"></p>
<!-- ko if:isAdded -->
<button data-bind="if: isAdded" class="btn btn-small btn-success action remove">
<i data-bind="click: $root.Summary.remove" class="icon-ok">Remove</i>
</button>
<!-- /ko -->
<!-- ko ifnot:isAdded -->
<form data-bind="submit: function() { $root.Summary.add($data); }">
<button data-bind="ifnot: isAdded" class="btn btn-small action add">
<i class="icon-plus">Add</i>
</button>
</form>
<!-- /ko -->
</li>
<!-- /ko -->
</ul>
JavaScript:
function Product(id, name, desc) {
var self = this;
self.id = ko.observable(id);
self.name = ko.observable(name);
self.desc = ko.observable(desc);
self.isAdded = ko.observable(false);
}
function Item(id, name) {
var self = this;
self.id = ko.observable(id);
self.name = ko.observable(name);
}
function SummaryViewModel() {
var self = this;
self.items = ko.observableArray([]);
self.add = function (item) {
self.items.push(new Item(item.id(), item.name()));
console.log(item);
item.isAdded(true);
};
self.remove = function (item) {
item.isAdded(false);
};
};
function ProductViewModel(products) {
var self = this;
self.products = ko.observableArray(products);
};
var products = [
new Product(1, "GTA V", "by Rockstar"),
new Product(2, "Watch_Dogs", "by Ubisoft")
];
ViewModel = {
Summary: new SummaryViewModel(),
Product: new ProductViewModel(products)
}
ko.applyBindings(ViewModel);
【问题讨论】:
-
请从您的代码中添加一些可用的 sn-ps 到您的问题中,以防万一您的 jsfiddle 链接在未来失效并且这个问题变得不可读。
-
感谢您的提示,尼尔。我做到了。