これはタイプミスと同じくらい恥ずかしいことだと思いますが、私はこれに行き詰まっており、非常に必死なので、誇りを持って支払うつもりです. ;)
これは私の場合です:
Task = function (data) {
var self = this;
self.TaskId = data.TaskId;
self.TaskName = ko.observable(data.TaskName);
}
ViewModel = function () {
var self = this;
self.Tasks = ko.observableArray();
self.SelectedTask = ko.observable();
}
$.getJSON("/myService/GetAllTasks",
function (tData) {
var mappedTasks = $.map(tData, function (item) {
return new Task(item)
});
self.Tasks(mappedTasks); // Populate Tasks-array...
});
self.newTaskItem = function () {
var newitem = new Task({
TaskId: -1,
TaskName: "enter taskname here"
});
self.Tasks.push(newitem); // THIS ONE CRASH
self.Tasks().push(newitem); // BUT SUBSTITUTED WITH THIS ONE IT RUNS ON...
self.editTaskItem(newitem);
};
self.editTaskItem = function (item) {
self.SelectedTask(item); // UNTIL TIL LINE WHERE IT CRASHES FOR GOOD...
self.showEditor(true); // makes Task-edior visible in HTML
};
ファイルに「self.SelectedTask.subscription」もありますが、コードから除外しても違いはありません。
また、データベース テーブルが空であるため、getJSON は MappedTasks にデータを返さず、self.Tasks() = [ ] のままであることにも言及する必要があります (Firebug によると)。
コード内の誤って閉じられたタグを修正しました。
パート2:
しばらくして、コードを最初からやり直すことにしました。それは私をさらに一歩進めました。
コードは次の行の 2 番目 (「self.newTaskItem」内) で停止します。
self.Tasks.push(newitem);
self.SelectedTask(newitem); // Here it fails.
これら 2 つのオブザーバブルは、HTML で次のように接続されています。
<select data-bind="options: Tasks, optionsText: '$root.TaskName', value: SelectedTask"</select>