来自ObservableArray的数据在我的表中显示两次

时间:2013-06-07 14:40:25

标签: knockout.js knockout-2.0

这是我的viewModel:

视图模型

var sitesTableModel = [
{
   nameCol: "nameCol-1",
   pagesCol: "pagesCol-1",
},
{
    nameCol: "nameCol-2",
    pagesCol: "pagesCol-2",
}];

var pagesTableModel = [
{
   lastCol: "lastCol-1",
   editedCol: "editedCol-1",
},
{
    lastCol: "lastCol-2",
    editedCol: "editedCol-2",
}];


var viewModel = {
    sitesTable: ko.observableArray(sitesTableModel),
    pagesTable: ko.observableArray(pagesTableModel),
};

然后我用这种方式调用web服务:

AJAX Call

ajaxService = (function () {
    var ajaxGetJson = function (method, request, callback, service) {
        $.ajax({
            url: "http://localhost:2880/Whatever.svc/Method",
            type: "GET",
            data: request,
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (result, statusMsg, status)
            {
                callback(result, statusMsg, status, request);
            },
            error: ServiceFailed 
        }).always(function () {
            ko.applyBindings(viewModel); 
            });
    }
    return {
        ajaxGetJson: ajaxGetJson,
    };
})();

以这种方式映射结果:

映射

function ModelTableSitesMapper(result, statusMsg, status, request) {

    var itemRow = [];

    //sitesTableModel
    result.forEach(function (entry) {
        itemRow.push({
            nameCol: entry.Title,
            pagesCol: entry.Pages,
        })
    });

    viewModel.sitesTable = ko.observableArray(itemRow);

};

对于另一个阵列也一样。

现在这是我的数据绑定:

数据绑定

    <table id="tableDocs">  
        <tbody data-bind="foreach: documentsTable" >
        <tr>
            <td data-bind="text: nameCol">Simon Werner Hansen</td>
            <td data-bind="text: pagesCol">swh002</td>
        </tr>
        </tbody>
    </table>

当我得到结果时,表格中的所有内容都被禁止两次。 我检查了模型,observableArray中没有双重数据。 我知道Iøm将对象声明为observableArray两次,这可能是问题,但我找不到任何其他更新阵列的方法:

viewModel.sitesTable = ko.observableArray(itemRow);

如果我这样做,它应该是它不起作用:

viewModel.sitesTable(itemRow);

也许有人能理解这个原因吗?

2 个答案:

答案 0 :(得分:1)

我发现了问题。

我在ajax调用的 .always 函数中应用了绑定ko.applyBinding,但因为我因为两个不同的原因而调用了两次服务,所以绑定被应用 TWICE 。 这导致了数据的重复。

我刚刚在创建模型后将绑定移到了函数之外。

答案 1 :(得分:0)

如果你尝试会发生什么:

var viewModel = {
    sitesTable: ko.observableArray([]),
    pagesTable: ko.observableArray([]),
};

没有提到你预先填充数组的变量是什么。

然后直接将每个项目添加到您的observable:

function ModelTableSitesMapper(result, statusMsg, status, request) {
    //sitesTableModel
    result.forEach(function (entry) {
        viewModel.sitesTable.push({
            nameCol: entry.Title,
            pagesCol: entry.Pages,
        })
    });
};