我有一个Knockout视图模型,其中包含一个计算的observable,它只根据文本输入的内容过滤一些原始数据。然后将此计算的observable绑定到表以显示信息。
每次计算出计算出的observable时,我都需要运行一个函数来更新表行上的一些事件监听器(我已经有了这个函数)。
但是,在计算出的observable更新后,我无法理解如何让它运行。在可观察函数内调用函数会在返回新值之前执行此操作,因此使用旧数据对其执行操作。我也考虑过扩展程序语法,但认为这是一个不合适的解决方案。
如果有人有解决方案或任何指示,我将不胜感激。
使用代码更新:
var viewModel = function(data) {
var self = this;
self.search = ko.observable('');
self.rawData = ko.observableArray(data);
self.filterData = ko.computed(function() {
return self.rawData().filter(function(item) {
var filter = self.search().toLowerCase();
return item.employeeNumber.toString().includes(filter) || item.name.toLowerCase().includes(filter) || filter == "";
});
});
};
异步函数使用返回的数据创建一个新的视图模型并应用绑定。
function reevaluateHandlers() {
// Code that should run every time the computed observable is calculated (filterData)
}
答案 0 :(得分:1)
多种方法:
在此函数之后有另一个计算函数,然后在第一个计算函数之后激活,即
self.filterData = ko.computed(function() {
return self.rawData().filter(function(item) {
var filter = self.search().toLowerCase();
return item.employeeNumber.toString().includes(filter) || item.name.toLowerCase().includes(filter) || filter == "";
});
});
self.reevaluateHandlers = ko.computed(function() {
var rawData = self.rawData();
var filter = self.search();
reevaluateHandlers();
});
简单超时功能,reevaluateHandlers函数将在返回数据后触发
self.filterData = ko.computed(function() {
var rawData = self.rawData();
var filter = self.search().toLowerCase();
var filteredData = rawData.filter(function(item) {
return item.employeeNumber.toString().includes(filter) || item.name.toLowerCase().includes(filter) || filter == "";
});
setTimeout(function() {
reevaluateHandlers();
}, 100);
return filteredData;
});
我认为第一种解决方案更有效,尽管我会使用以下方法优化filterdata代码:
var filter = self.search().toLowerCase();
它的最小但它会产生影响,特别是随着阵列大小的增加。还要看看linqjs和knockouts pauseablecomputed,因为你可以控制计算机何时触发。