我有一个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)
})
因为这将是一个无限循环。我如何过滤订阅功能中的数组?
答案 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();
};