1

遅くなったので、私はおそらく愚かで盲目ですが、しばらくこれに苦労しています. ここで何が悪いのか誰にもわかりますか?

私の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/

4

1 に答える 1

2

newitemはスコープ外です。varは で定義されてい.newTaskます。

nemesvが推奨するように、あなたがすべきことは、呼び出してinsideを使用するnewitemときにパラメーターとして 渡すという事実を使用することです。editTaskitemeditTask

self.SelectedTask(item);   // instead of self.SelectedTask(newitem);

フィドル

于 2013-10-05T22:17:09.613 に答える