0

我有这个视图模型,在我的网络上我有一个更新 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;

            });

}

4

1 回答 1

1

如果没有其余的代码,很难准确地判断这将如何表现。话虽如此,您正在做一些我建议您避免的非常奇怪的事情。

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

我建议为您的视图模型使用构造函数。

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定义过程中。计算对象必须在定义期间引用至少一个可观察属性才能使其具有反应性。

您的下一个问题是您的计算定义不是一个函数,而是一个对象。它甚至不是一个合法的对象,它有回报。这段代码甚至不应该编译。这是错误的。淘汰赛文档在这一点上很清楚:计算的定义为function.

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

于 2013-07-24T16:27:53.310 回答