我担心这会像错字一样令人尴尬,但是由于我坚持这样做并且非常绝望,所以我愿意为此感到自豪。 ;)

这是我的情况:

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不将任何数据返回给被映射的Task,而留下self.Tasks()= [](根据Firebug)

我已经修复了代码中错误关闭的标签。

第2部分:

一段时间后决定从起点重做我的代码。它使我更进一步。

现在,代码在以下两行中停止(在“ self.newTaskItem”中):

    self.Tasks.push(newitem);
    self.SelectedTask(newitem);  // Here it fails.


这两个可观察对象在我的HTML中是这样连接的:

<select data-bind="options: Tasks, optionsText: '$root.TaskName', value: SelectedTask"</select>

最佳答案

看来您的ViewModel()函数永远不会关闭。在要结束该函数声明的任何地方添加一个结束}。在我看来(根据您的格式),您需要这样做:

ViewModel = function () {
    var self = this;
    self.Tasks = ko.observableArray();
    self.SelectedTask = ko.observable();
}


此外,您需要使用$.getJson关闭);呼叫:

$.getJSON("/myService/GetAllTasks",
    function (tData) {
        var mappedTasks = $.map(tData, function (item) {
            return new Task(item)
        });

        self.Tasks(mappedTasks); // Populate Tasks-array...
});

09-25 17:14
查看更多