如何使用KnockoutJS从外部observableArray中删除项目

Gui*_*nge 4 javascript knockout.js

目标

使用KnockoutJS从外部observableArray中删除项目.

问题

observableArray我的申请中有两个.一个用于购买可用产品,另一个用于我在摘要中添加的产品,点击进入add button.

直到这里,一切正常.但现在我需要从摘要中删除项目并更改按钮状态/样式 - 我不知道如何访问外部observableArray来执行此操作.

要了解我的问题,请查看此jsFiddle或查看下一主题中的标记.

正如您所看到的,当我点击时add button,产品将转到摘要.当我点击删除 - 无论该按钮是来自摘要还是产品 - 我想更改按钮状态并从摘要中删除该项目.从技术上讲,我想从删除的项items' observableArray利用products' 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>
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 10

你可以搜索它.

您可以在购物车中查询具有相同ID的商品,然后将其删除

self.remove = function (item) {
    var inItems = self.items().filter(function(elem){
        return elem.id() === item.id(); // find the item with the same id
    })[0];
    self.items.remove(inItems);
    item.isAdded(false);
};
Run Code Online (Sandbox Code Playgroud)

除非你有成千上万的物品,否则应该足够快.只记得使用items.remove()它会知道更新observableArray:)

  • @GuilhermeOderdenge StackOverflow不是"为我免费编写此代码"网站.虽然我喜欢回答关于设计的问题,如何构建代码,或者如何完成一般事情 - 比如你在KnockoutJS中如何在另一个集合中找到项目的原始问题,我无意解决应用程序错误不是问题,也不打算编写您的生产代码.这不是这个网站的工作方式,这将教会面临同样问题的其他用户_nothing_,并且通常是教学上不好的方法. (2认同)