敲除计算的依赖关系最初是空的

时间:2013-07-24 16:10:49

标签: javascript knockout.js

我有这个viewmodel,在我的网上我有一个更新sortedallemployees选项的下拉列表。它工作正常,除了我的表最初是空的。一旦我第一次获取数据就排序。似乎在创建虚拟机时,它不会等待填充员工。

var vm = {
   activate: activate,
   allemployees: allemployees,
   sortedallemployees:ko.computed( {
   return allemployees.sort(function(f,s) {
   var ID =  SelectedOptionID(); 
   var name = options[ ID - 1].OptionText;
        if (f[name] == s[name]) {
            return f[name] > s[name] ? 1 : f[name] < s[name] ? -1 : 0;
            }
           return f[name] > s[name] ? 1 : -1;

            });

}

1 个答案:

答案 0 :(得分:1)

如果没有其余的代码,很难确切知道这将如何表现。话虽这么说,你正在做一些我建议你避免的非常奇怪的事情。

首先,将除最简单的视图模型之外的所有视图模型定义为对象文字将导致您感到痛苦。当以这种方式定义时,任何具有函数或计算的东西几乎肯定会表现得很奇怪,或者更可能根本不表现。

我建议为viewmodels使用构造函数。

var Viewmodel = function(activate, allEmployees) {
    var self = this;
    self.activate = activate;
    self.allEmployees = ko.observableArray(allEmployees);
    self.sortedEmployees = ko.computed(function() {
        return self.allEmployees().sort(function(f,s) {
            //your sort function
        });
    });
};

var vm = new Viewmodel(activate, allemployees);

这种方法有几个优点。首先,它是可重复使用的。其次,您可以在构造期间正确引用其属性,例如在computed定义期间。计算器必须在定义期间至少引用一个可观察属性才能被激活。

您的下一个问题是您的计算定义不是函数,而是对象。它甚至不是一个合法的对象,它有一个回报。这段代码甚至不应该编译。这是错的。 Knockout Documentation在这一点上很明确:计算结果是用function定义的。

您的最后一个问题是您的sort函数引用了viewmodel之外的内容:SelectedOptionID()。这不一定会阻止它工作,但通常是不好的做法。