2017-06-20 32 views
0

我有一个Knockout视图模型,它包含一个计算的observable,它根据文本输入的内容简单地过滤一些原始数据。这个计算出来的observable然后绑定到一个表来显示信息。每当计算可观察到的变化时运行函数Knockout

每次计算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

你可以发布你的代码吗? –

+0

@ C.Fasolin我已经添加了一些代码,但我不确定它增加了多少价值。 – dbr

回答

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; 
    }); 
    

我认为第一个解决方案是更有效的,但我会与优化筛选数据代码:

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

它最小但它会有所作为,特别是与ar射线尺寸增加。同样看看linqjs和knockouts可以暂停计算,因为这样你就可以控制计算结果何时启动。