Knockout.js:订阅时过滤数组

时间:2015-06-03 16:19:10

标签: javascript knockout.js

我有一个observableArray,在其订阅回调中我需要过滤传递的新数组。

例如:

myArray.subscribe(function(elements) {
 ko.utils.arrayFilter(elements, function(element) {
  return element.x > 10
 })
})

这当然不起作用,因为arrayFilter和原生filter()方法都不会改变原始数组。问题是我无法做到这一点:

myArray.subscribe(function(elements) {
 var newArray = ko.utils.arrayFilter(elements, function(element) {
  return element.x > 10
 })

myArray(newArray)
})

因为这将是一个无限循环。我如何过滤订阅功能中的数组?

2 个答案:

答案 0 :(得分:1)

最好的解决方案是nemesv建议的解决方案:不要改变数组本身,而是创建一个新的计算observable来封装过滤器行为。

var filteredArray = ko.computed(function () {
    return ko.utils.arrayFilter(myArray(), function(element) {
        return element.x > 10;
    });
});

最简单的解决方案,如果你感到懒惰,就会取代

myArray(newArray)

if (newArray.length !== elements.length) {
    myArray(newArray);
}

正如James Thorpe的评论中所建议的那样。这里的缺陷是每个订户可能会运行两次,包括过滤器操作本身。

答案 1 :(得分:0)

您的问题意味着您确实想要封装数据,而不是直接在视图模型上公开它。

尝试这样的事情:

var arr = ko.observableArray();

this.AddItem = function(element) {
    if (element.x > 10)
        arr.push(element);
};

this.GetItems = function() {
    return arr();
};