簡體   English   中英

過濾器可觀察到的陣列

[英]Filter knockout observable array

在我當前的項目中,我正在使用下划線過濾器,該過濾器可在我的提琴上使用,但不適用於我的當前項目,我想做的是改為使用剔除過濾器,但我不確定該怎么做。

這是我使用下划線過濾器的內容

HTML

<div data-bind="foreach: items">
<div class="profile" data-bind="text: name, click: $parent.clicked, enable: active,  css:{highlight: active()}"></div>
</div>

<hr>
<h2>Selected Card</h2>
<div data-bind="foreach: selectedItems">
<div data-bind="text: name"></div>
 </div>
<input type="button" data-bind="click: save" value="Save">

CSS

.profile {
width: 50px;
height: 80px;
color: black;
background-color:silver;
border: 1px solid black;
float: left;
line-height:80px;
text-align: center;    
margin: 2px;
}
.highlight {
background: yellow !important;
border:1px solid #000;
color: black;
}

JavaScript的

 function Card(number) {
this.active = ko.observable(false);
this.name = ko.observable(number);
}

var model = function () {
var cards = [1, 2, 3, 5, 8, 13, 20, 40, 100];
for (var i = 0 ; i < cards.length ; i++)
    cards[i] = new Card(cards[i]);
var items = ko.observableArray(cards)
var selectedItems = ko.computed(function () {
    return _.filter(items(), function (item) {
        return item.active();
    });
})

var clicked = function (item) {
    items().forEach(function (item) { item.active(false) });
    item.active(!this.active());
};

var save = function () {
    alert("sending items \n" + ko.toJSON(selectedItems()));
}

return {
    items: items,
    selectedItems: selectedItems,
    save: save,
    clicked: clicked
}
}



ko.applyBindings(model);

這是小提琴http://jsfiddle.net/grahamwalsh/6RnXM/

如果未正確設置此關鍵字,您可能會感到困惑。 我建議您使用self關鍵字來解決您的困惑。 另外,我看到您揭示的模塊模式最后缺少括號。 這是固定的JavaScript:

function Card(number) {
    this.active = ko.observable(false);
    this.name = ko.observable(number);
}

var model = function () {
    var self = this;
    self.cards = [1, 2, 3, 5, 8, 13, 20, 40, 100];
    for (var i = 0 ; i < cards.length ; i++)
        cards[i] = new Card(cards[i]);
    self.items = ko.observableArray(cards)
    self.selectedItems = ko.computed(function () {
        return _.filter(items(), function (item) {
            if(item.active())
            {
                return item;
            }
        });
    })

    self.clicked = function (item) {
       item.active(true);
    };

    self.save = function () {
        alert("sending items \n" + ko.toJSON(selectedItems()));
    }

    return {
        items: items,
        selectedItems: selectedItems,
        save: save,
        clicked: clicked
    }
}();



ko.applyBindings(model);

您可以在此處檢查更新的JSFiddle。

此外,如果您不想使用下划線過濾選項,則也可以使用剔除過濾器:

function Card(number) {
    this.active = ko.observable(false);
    this.name = ko.observable(number);
}

var model = function () {
    var self = this;
    self.cards = [1, 2, 3, 5, 8, 13, 20, 40, 100];
    for (var i = 0 ; i < cards.length ; i++)
        cards[i] = new Card(cards[i]);
    self.items = ko.observableArray(cards)
    self.selectedItems = ko.computed(function () {
        return ko.utils.arrayFilter(self.items(), function(item) {
           if(item.active())
           {
                return item;
           }
        });

    });

    self.clicked = function (item) {
       item.active(true);
    };

    self.save = function () {
        alert("sending items \n" + ko.toJSON(selectedItems()));
    }

    return {
        items: items,
        selectedItems: selectedItems,
        save: save,
        clicked: clicked
    }
}();



ko.applyBindings(model);

這是第二個選項的JSFiddle。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM