遅くなったので、私はおそらく愚かで盲目ですが、しばらくこれに苦労しています. ここで何が悪いのか誰にもわかりますか?
私のHTML:
<select data-bind="options: Tasks, optionsText: 'TaskName', value: SelectedTask"></select>
<button data-bind="click: newTask">Add New Text</button>
<div data-bind="with: SelectedTask, visible: showEditor()">
<div>
Taskname: <input data-bind="value: TaskName" />
</div>
</div>
ビューモデル:
Type.registerNamespace("myNameSpace");
myNameSpace.Task = function (data) {
var self = this;
self.TaskId = data.TaskId;
self.TaskName = ko.observable(data.TaskName);
};
myNameSpace.ViewModel = function () {
var self = this;
self.SelectedTask = ko.observable();
self.Tasks = ko.observableArray();
self.showEditor = ko.observable(false);
$.getJSON("/myService/GetAllTasks", function (allData) {
var mappedTasks = $.map(allData, function (item) {
return new myNameSpace.Task(item)
});
self.Tasks(mappedTasks);
});
self.newTask = function () {
var newitem = new myNameSpace.Task({
TaskId: -1,
TaskName: "...your task title..."
});
self.Tasks.push(newitem);
self.editTask(newitem);
};
self.editTask = function (item) {
self.SelectedTask(item); // My program stops executing on this line
self.showEditor(true);
};
}; // End of ViewModel
このコードは「self.SelectedTask(item);」で失敗します。理由がわかりません。db-table が空であるため、self.Tasks() を埋める getJSON は何も返しません。(これは問題の一部でしょうか?)
私が望むのは、「click:newTask」イベントが発生した後に TaskName を編集することです。新しいタスクがタスクの配列にプッシュされ、エディターが表示されるように設定して、SelectedTask のタスク名を入力します。これは、"newTask" で作成されたものである必要があります。
ここでフィドル: http://jsfiddle.net/dL3JB/2/