【发布时间】:2015-01-11 19:49:05
【问题描述】:
我有一个 javascript viewModel,它由一个包含项目列表的“模型”数据集启动。因为我想从我的页面在项目之间切换,所以我在订阅中收集所有其他数据。 “selectedProject”定义了来自<select> 的选定值。
我通过将 selectedProject 启动到 Projects-array 中的第一个元素来第一次触发订阅。
不知何故我收到错误消息
TypeError: batch is undefined
return item.parentID === batch.parentID;
^
我不明白为什么。
这是我的代码:
ViewModel = function (model) {
var self = this;
self.selectedProject = ko.observable();
self.selectedText = ko.observable();
self.Textbatches = ko.observableArray();
self.Projects = ko.observableArray(
ko.utils.arrayMap(model, function (item) {
return new Project(item);
}));
self.selectedProject.subscribe(function (project) {
/* ...some code... */
$.getJSON("myService/GetTextbatchesFromDB", "projectID=" + project.projectID,
function (allData) {
var mappedTextbatches = $.map(allData, function (item) {
return new Textbatch(item);
});
self.Textbatches(mappedTextbatches);
self.selectedText(self.Textbatches()[0]);
}
); // End of $.getJSON
/* ...some more code... */
}
self.selectedProject(self.Projects()[0]);
self.parentIDFilteredTextbatches = ko.computed(function () {
var batch = self.selectedText();
return ko.utils.arrayFilter(self.Textbatches(), function (item) {
return item.parentID === batch.parentID; /* ERROR ON THIS LINE */
});
});
}
而在中:
<script>
// some code getting "model from the db...
var viewModel = new ViewModel(model);
ko.applyBindings(viewModel);
</script>
我发现,如果我在 self.selectedText() 初始化之后将“self.parentIDFilteredTextbatches = ko.computed()”-functon 移动到 self.selectedProject.subscribe-function 中,它将在第一个页面时起作用已加载。
但是,我不喜欢这样的视图模型结构(也许我会习惯它),更糟糕的是,我在选择新项目时遇到了同样的错误(即触发了 selectedProject.subscription)。
【问题讨论】:
-
好的,谢谢。让我知道你是否想出办法。我对这个 MVVM/javascript 很新鲜,所以我可能缺乏一些基本的了解。
-
我怀疑
var mappedTextbatches你没有对那个局部变量做任何事情。您是否在代码编辑中排除了另一个mappedTextbatches声明? -
我对 mappedTextbatches 没有任何问题。 Textbatches-array 在 selectedProject.subscribe 运行后获取值。
-
问题是getjson是异步的
标签: javascript mvvm knockout.js