Knockout.js 当数量设置为0时,如何删除KnockOutjs项?

Knockout.js 当数量设置为0时,如何删除KnockOutjs项?,knockout.js,Knockout.js,我有一个购物车的项目数量可以改变用户。当商品数量设置为0时,我想从购物车中删除商品。现在,我有一个if条件,当数量设置为0时,该条件会使项目从列表中消失,但是如果您查看购物车上的项目总数,该数字不会改变。当数量设置为0时,如何从购物车中删除项目 <!-- HTML Part --> <div> <div> <span><strong>Item</strong></span>

我有一个购物车的项目数量可以改变用户。当商品数量设置为0时,我想从购物车中删除商品。现在,我有一个if条件,当数量设置为0时,该条件会使项目从列表中消失,但是如果您查看购物车上的项目总数,该数字不会改变。当数量设置为0时,如何从购物车中删除项目

<!-- 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'>&nbsp;</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;
        });
        ...