每次计算的observable更改Knockout

时间:2017-06-20 06:57:44

标签: javascript knockout.js

我有一个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)
}

1 个答案:

答案 0 :(得分:1)

多种方法:

  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();
    });
    
  2. 简单超时功能,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;
    });
    
  3. 我认为第一种解决方案更有效,尽管我会使用以下方法优化filterdata代码:

    var filter = self.search().toLowerCase();
    

    它的最小但它会产生影响,特别是随着阵列大小的增加。还要看看linqjs和knockouts pauseablecomputed,因为你可以控制计算机何时触发。