Knockout.js 当数量设置为0时,如何删除KnockOutjs项?
我有一个购物车的项目数量可以改变用户。当商品数量设置为0时,我想从购物车中删除商品。现在,我有一个if条件,当数量设置为0时,该条件会使项目从列表中消失,但是如果您查看购物车上的项目总数,该数字不会改变。当数量设置为0时,如何从购物车中删除项目Knockout.js 当数量设置为0时,如何删除KnockOutjs项?,knockout.js,Knockout.js,我有一个购物车的项目数量可以改变用户。当商品数量设置为0时,我想从购物车中删除商品。现在,我有一个if条件,当数量设置为0时,该条件会使项目从列表中消失,但是如果您查看购物车上的项目总数,该数字不会改变。当数量设置为0时,如何从购物车中删除项目 <!-- HTML Part --> <div> <div> <span><strong>Item</strong></span>
<!-- HTML Part -->
<div>
<div>
<span><strong>Item</strong></span>
<span><strong>Price</strong></span>
<span><strong>Quantity</strong></span>
<span><strong>Subtotal</strong></span>
</div>
</div>
<div data-bind='foreach:items'>
<!-- ko if:qty()>0 -->
<div>
<span data-bind='html: title'></span>
<span data-bind='text: price'></span>
<span data-bind='visible: !editing(), text:formatted_qty'> </span>
<input type='text' name='qty' data-bind='visible:editing, value:formatted_qty, hasFocus:editing' size="2"/>
<a href="#" data-bind='visible: !editing(), click:edit'>Edit Qty</a>
<span data-bind='text:sub_total()'></span>
<a href='#' data-bind='click: $parent.remove_item'>Remove</a>
</div>
<!-- /ko -->
</div>
<p>
<strong>Total Items</strong>: <span data-bind="text: total_items()"></span>
</p>
<!-- Javascipt Part -->
function item(id, title, price, qty) {
var self = this;
self.id = ko.observable(id);
self.title = ko.observable(title);
self.price = ko.observable(price);
self.qty = ko.observable(qty);
self.editing = ko.observable(false);
self.edit = function () {
self.editing(true);
};
self.formatted_qty = ko.computed({
read: function () {
return self.qty();
},
write: function (value) {
if (isNaN(value) || value.length < 1) {
console.error('Invalid Quantity');
} else {
self.qty(value);
console.info('Quantity changed');
}
},
owner: self
});
self.sub_total = ko.computed(function () {
var total = self.price() * self.qty();
if (isNaN(total)) {
return '-';
}
return total;
}, self);
}
function vm() {
var self = this;
self.items = ko.observableArray([
new item('1', 'Item1', 10, 1),
new item('2', 'Item2', 20, 3),
new item('3', 'Item3', 15, 1),
new item('4', 'Item2', 25, 2),
new item('5', 'Item2', 30, 6)
]);
self.remove_item = function (item) {
self.items.remove(item);
};
self.total_items = ko.computed(function(){
return self.items().length;
});
}
ko.applyBindings(new vm());
项目
价格
数量
小计
项目总数:
功能项(id、标题、价格、数量){
var self=这个;
self.id=ko.可观察(id);
self.title=ko.可观察(title);
自身价格=可观测(价格);
自身数量=可观察到的ko(数量);
自编辑=可观察(假);
self.edit=函数(){
自我编辑(真);
};
自格式化_数量=ko.computed({
读:函数(){
返回自身数量();
},
写入:函数(值){
if(isNaN(值)| value.length<1){
控制台错误(“无效数量”);
}否则{
自身数量(价值);
控制台信息(“变更数量”);
}
},
所有者:self
});
self.sub_total=ko.computed(函数(){
var total=自售价格()*自售数量();
若有(isNaN(总计)){
返回“-”;
}
返回总数;
},自我);
}
函数vm(){
var self=这个;
self.items=ko.array([
新项目('1','1',10,1),
新项目('2','2',20,3),
新项目('3','3',15,1),
新项目('4','2',25,2),
新项目('5','2',30,6)
]);
self.remove_item=函数(项){
self.items.remove(项目);
};
self.total_items=ko.computed(函数(){
返回self.items().length;
});
}
应用绑定(新vm());
请参阅此JSFIDLE:
您不能通过敲除本身进行操作,因为敲除只是对作为输入的基础项集合进行计算,但您可以按以下方式修改计算总数函数,或者使用删除代码来响应另一个事件:
self.total_items = ko.computed(function(){
for(var i=self.items().length-1;i>=0;i--)
{
var item = self.items()[i];
if (item.qty()<=0)
{
self.items.remove(item);
};
};
return self.items().length;
});
self.total_items=ko.computed(函数(){
对于(var i=self.items().length-1;i>=0;i--)
{
var item=self.items()[i];
如果(item.qty()有几个小的变化,这会使它更令人震惊,比如:
- 如果您想排除某些项目(在您的情况下,使用
quantity的项目),请使用一个名为filteredItems
的计算工具。谢谢您的回答。我使用了您的方法,效果很好。谢谢您的建议。我刚开始使用KO,您提供的提示非常有用。
function item(id, title, price, qty) {
...
// don't need these to be observable as they don't change
self.id = id;
self.title = title;
self.price = price;
...
function vm() {
...
self.filteredItems = ko.computed(function(){
return self.items().filter(function(item){
return item.qty() > 0;
});
});
...
self.total_items = ko.computed(function(){
return self.filteredItems().length;
});
...