苦苦挣扎,淘汰了我

时间:2013-10-04 18:33:22

标签: javascript knockout.js

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

这是我的情况:

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> 

3 个答案:

答案 0 :(得分: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...
});

答案 1 :(得分:1)

我不是100%确定你的问题是什么或者你得到了什么错误但这就是我要做的 - 将你的Task =功能更改为功能任务 -

function Task(data) {
    var self = this;

    self.TaskId = data.TaskId;
}

通过说任务=函数而不使用前面的var,你在全局命名空间中注册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。修复此问题,或者如果您出于某种原因故意这样做,请显示您的查看代码,并更好地解释出现问题以及您看到的错误。

答案 2 :(得分:1)

(假设您的真实代码中没有未披露的东西)

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