2

我担心这会像打错字一样令人尴尬,但由于我坚持这一点并且非常绝望,我愿意自豪地付出代价。;)

这是我的情况:

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部分:

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

代码现在停在这些行的第二行(在“self.newTaskItem”中):

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

这两个 observable 在我的 HTML 中是这样连接的:

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

3 回答 3

2

看起来你的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...
});
于 2013-10-04T18:37:54.727 回答
1

我不是 100% 确定您的问题是什么或您遇到了什么错误,但这是我会做的 - 将您的 Task = 功能更改为功能 Task -

function Task(data) {
    var self = this;

    self.TaskId = data.TaskId;
}

通过在前面不使用 var 的情况下说 Task = function,您就是在全局命名空间中注册 Task,这不是一个好主意。您的视图模型也是如此...如果您仍然可以修复它...

self.newTaskItem = function () {

    var newitem = new Task({
        // Your Task is looking for a TaskId, not a TextBatchId
        TaskId: 1
    });

    self.Tasks.push(newitem);
    self.editTaskItem(newitem);
};

此外,您正在创建一个 TextBatchId,我认为您的 Task 对象正在寻找一个 TaskId。修复它,或者如果您出于某种原因故意这样做,请显示您的视图代码并更好地解释发生了什么问题以及您看到的错误。

于 2013-10-04T20:08:56.393 回答
1

(假设你的真实代码中不存在未封闭的东西)

In Task,TaskId不是可观察的,因此当您设置SelectedTask特定任务时,您的编辑器字段将不会正确更新(假设 an 的元素observableArray本身是一个相当常见的错误observable,但除非您明确地制作它们,否则它们不是所以)。

于 2013-10-04T21:33:02.360 回答