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);”上失败 我不知道为什么。填充 self.Tasks() 的 getJSON 不会返回任何内容,因为 db-table 是空的。(这可能是问题的一部分吗?)

我想要的是在“click:newTask”事件触发后编辑TaskName。新任务被推送到我的任务数组中,我将编辑器设置为可见以键入 SelectedTask 的任务名——这应该是刚刚在“newTask”中创建的那个。

在这里小提琴:http: //jsfiddle.net/dL3JB/2/

4

1 回答 1

2

newitem超出范围,var定义在.newTask.

正如nemesv所建议的那样,您应该做的是使用您在调用和使用insidenewitem时作为参数 传递的事实。editTaskitemeditTask

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

小提琴

于 2013-10-05T22:17:09.613 回答