无法处理绑定,请使用ko.mapping.fromJS将JSON数据推送到ObservableArray

时间:2016-02-15 08:58:18

标签: javascript json ajax knockout.js

任何人都可以解释我的代码中的错误,我是淘汰赛的新手...所以,最初我从数据库接收json数据并且它有效。比我点击添加一些'我想将数据库中的相同数据添加(推送)到我的可观察数组。下面的代码显然不起作用。谢谢。 错误:无法处理绑定" text:function(){return AdId}" ...

HTML:

<div data-bind="foreach: Ads">     
    <p data-bind="text: AdId"></p>         
</div>

<div data-bind="click: addSome">Add some</div>

MODEL:

function AdListModel() {
var self = this;
self.Ads = ko.mapping.fromJS([]);

self.result = function (model) {
    ko.mapping.fromJS(model, self.Ads);
}    

self.InitialData = function () {
    $.ajax({
        type: "GET",
        url: '/Home/GetAllAds',
        data: { startPosition: 0, numberOfItems: 2 },
        dataType: "json",
        success: function (data) {

            self.result(data); <---- works

        }
    });
}

self.addSome = function () {
    $.ajax({
        type: "GET",
        url: '/Home/GetAllAds',
        data: { startPosition: 0, numberOfItems: 2 },
        dataType: "json",
        success: function (data) {

            self.Ads.push(data); <---- doesn't work


        },
    });

};

self.InitialData();
}

ko.applyBindings(new AdListModel());

我试过self.Ads.push(ko.mapping.fromJS(data)) - 没有工作。

1 个答案:

答案 0 :(得分:1)

从错误消息中可以看出,model没有AdId属性。

您可以添加API返回的JSON模型的转储吗?

修改

您的Ads媒体资源应该是ko.observableArray(),而不是ko.mapping.fromJS([])

function AdListModel() {
    var self = this;
    self.Ads = ko.observableArray([]);

    self.result = function (model) {
        ko.mapping.fromJS(model, self.Ads);
    }    

修改2

你必须在推送之前映射数据:

$.ajax({
    type: "GET",
    url: '/Home/GetAllAds',
    data: { startPosition: 0, numberOfItems: 2 },
    dataType: "json",
    success: function (data) {
        self.Ads.push(ko.mapping.fromJS(data));
    },
});

编辑3

如果你的JSON看起来像这样:

[
    {"AdId":1,"AdContent":"test1"},
    {"AdId":2,"AdContent":"test2"}
]

然后它是一个数组,你必须迭代每个条目:

$.ajax({
    type: "GET",
    url: '/Home/GetAllAds',
    data: { startPosition: 0, numberOfItems: 2 },
    dataType: "json",
    success: function (data) {
        data.forEach(function(d) {
            self.Ads.push(ko.mapping.fromJS(d));
        });
    },
});