淘汰赛,js:通过"强力打击"迭代observableArray

时间:2014-03-25 17:46:16

标签: knockout.js

我已创建this fiddle来说明我的问题。

我正在尝试在整个应用程序(SPA)中使用“强类型”对象。原因是我遇到了来自服务器的对象与运行时创建的对象之间的差异问题。虽然两者具有相同的属性,但是有一些缺少CRUD函数,在某些情况下,还有下拉列表的枚举。现在我发现我不能使用foreach绑定,因为我的observableArray没有元素,但在代码方面它没有。我在另一个SPA上做了类似的事情,但区别在于另一个我没有在所有属性上使用ko.observable *。另一个工作正常。 (编辑:我删除了属性上的ko.observable并且行为仍在继续)。

该应用程序有两个视图模型:AppViewModel和StrongViewModel。 AppViewModel编排整个应用程序,而StrongViewModel是应用程序的子集。当用户想要运行一个进程selectedProcessId时,它会将进程中的数据加载到selectedProcessData中。 selectedTerocessData的所有结果都显示在表格中。

启动应用程序:

var app = new AppViewModel();
app.initialize();
ko.applyBindings(app);

加载第一个进程:

self.initialize = function () {
self.goToProcess(self.processes()[0]);
};

用户选择第二个进程(强类型)并且goToProcess填充一个回调selectedProcessData:

self.goToProcess = function (userProcess) {
    self.chosenProcessId(userProcess);
    self.chosenProcessData = ko.observableArray([]);

    if (userProcess.getPath) {
        if (userProcess.callback && typeof (userProcess.callback) === "function") {
            var arrayResult = userProcess.callback(this.createCallback, this.updateCallback, this.deleteCallback);

            for (var i = 0; i < arrayResult.length; i++) {
                self.chosenProcessData.push(arrayResult[i]);
            }

            alert(self.chosenProcessData().length);
        }
    }
};

我不确定为什么将这些属性变成observables使得它停止工作。请帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

你在goToProcess里面用这一行取消绑定selectedProcessData(它与dom的连接)

self.chosenProcessData = ko.observableArray([]);

应该是。

self.chosenProcessData();

甚至更好地删除此行和for循环,然后使用

self.chosenProccessData(userProcess.callback(this.createCallback, this.updateCallback, this.deleteCallback));

修复示例。

http://jsfiddle.net/5KZun/