【问题标题】:Data not binding to table using KnockoutJS数据未使用 KnockoutJS 绑定到表
【发布时间】:2015-05-14 02:29:29
【问题描述】:

我正在开发我的第一个定制 KO 实现,并且我已将数据绑定到我页面中的表,但不是它没有绑定到它。我可以验证我的 Web 服务是否被调用并且它正在返回数据。但是,我不知道为什么数据没有加载到表中,因为我没有收到任何错误。

我确信我错过了一些简单的东西,因为我是这个新手。 :)

我正在使用 KO 3.1.0。

页面标记

<table class="dnnGrid">
    <thead>
        <tr class="dnnGridHeader">
            <th>Task ID</th>
            <th>Name</th>
            <th>Description</th>
            <th>Date Updated</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: tasks">
        <tr class="dnnGridRow">
            <td data-bind="text: ID"></td>
            <td data-bind="text: Name"></td>
            <td data-bind="text: Description"></td>
            <td data-bind="text: LastUpdatedDate"></td>
        </tr>
    </tbody>
</table>

页面脚本

var sf = $.ServicesFramework(<%=ModuleId %>);
var userId = <%=UserId%>;
var serviceUrl = sf.getServiceRoot('POC');
var moduleId = sf.getModuleId();

$(document).ready(function() {

    ko.applyBindings(TaskViewModel);

    GetTasks();

    $('#lnkSave').click(function() {
        SaveTask();
        GetTasks();
    });
});

导入脚本

var Task = function(data) {

data = data || {};

var self = this;

self.ID = ko.observable(data.ID);
self.ModuleId = ko.observable(data.ModelId);
self.ContentItemId = ko.observable(data.ContentItemId);
self.Name = ko.observable(data.Name);
self.Description = ko.observable(data.Description);
self.LastUpdatedDate = ko.observable(data.LastUpdatedDate);
self.LastUpdatedBy = ko.observable(data.LastUpdatedBy);
}
var TaskViewModel = function(items) {
var self = this;

var newTask = {
    'ID': ko.observable(),
    'ModuleId': ko.observable(),
    'ContentItemId': ko.observable(),
    'Name': ko.observable(),
    'Description': ko.observable(),
    'LastUpdatedDate': ko.observable(),
    'LastUpdatedBy': ko.observable()
};
self.tasks = ko.observableArray(ko.utils.arrayMap(items, function (data) {
    return new Task(data);
}));

self.updateTask = function (task) {
    GetTasks();
}
}
function SaveTask() {
var task = {
    'ModuleId': moduleId,
    'LastUpdatedBy': userId,
    'Name': $('#txtName').val(),
    'Description': $('#txtDescription').val()
}

$.ajax({
    type: 'POST',
    url: serviceUrl + 'Task/CreateTask',
    data: JSON.stringify(task),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    beforeSend: sf.setModuleHeaders,
    success: function (data) {
        var results = $.parseJSON(data);
        ParseResults(results, viewModel);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert("STATUS: " + xhr.status + "\nERROR:\n" + thrownError);
    }
});
}
function GetTasks() {
if (TaskViewModel) {
    if (TaskViewModel.tasks) {
        TaskViewModel.tasks.removeAll();
    }
}

$.ajax({
    type: 'GET',
    url: serviceUrl + 'Task/GetTasks?ModuleId=' + moduleId,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    beforeSend: sf.setModuleHeaders,
    success: function (data) {
        var results = $.parseJSON(data);
        TaskViewModel.tasks = results;
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert("STATUS: " + xhr.status + "\nERROR:\n" + thrownError);
    }
});
}

【问题讨论】:

  • 请减少问题to the absolute minimum。删除所有 Ajax,使其成为单个值的数组,删除严格意义上不必要的所有内容。如果之后仍然无法正常工作,请返回并发布您的简化代码。
  • 绝对最小代码最初确实有效。但是,我不想一遍又一遍地使用绝对最小值来编写应用程序。该应用程序将使用可怕的意大利面条式代码编写。
  • 你误会了。您的任务是找出问题并用尽可能少的代码行重现它,这样我们就不必调试您的整个代码。再次阅读我之前评论中的链接。

标签: javascript knockout.js data-binding binding dotnetnuke


【解决方案1】:

尝试将此行 ko.applyBindings(TaskViewModel) 移动到 .ready 函数的底部

$(document).ready(function() {

    GetTasks();

    $('#lnkSave').click(function() {
        SaveTask();
        GetTasks();
    });
    ko.applyBindings(TaskViewModel);
});

在这行之后,var results = $.parseJSON(data);添加一个调试器;声明并打开chrome开发者工具(F12键),刷新页面并使用F10键单步执行代码。

此时您应该可以在results 中看到解析后的数据。如果它不是必需的格式,您可能需要像这样分配 TaskViewModel.tasks

TaskViewModel.tasks = ko.utils.arrayMap(results, function (task) {
                return new Task(task);
            });

【讨论】:

  • 不幸的是,这似乎没有任何区别。对不起。 :(
猜你喜欢
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2013-12-22
相关资源
最近更新 更多