【问题标题】:Unable to process binding, push JSON data to ObservableArray using ko.mapping.fromJS无法处理绑定,使用 ko.mapping.fromJS 将 JSON 数据推送到 ObservableArray
【发布时间】:2016-05-26 02:37:55
【问题描述】:

谁能解释我的代码有什么问题,我是新手...所以,最初我从数据库接收到 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>

型号:

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)) - 没用。

【问题讨论】:

    标签: javascript json ajax knockout.js


    【解决方案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));
            });
        },
    });
    

    【讨论】:

    • [{"AdId":1,"AdContent":"test1"},{"AdId":2,"AdContent":"test2"},.......],但最初它可以工作,当我想在点击时添加相同的数据时它不起作用。
    • 不,这不起作用,我尝试更改 self.Ads(data) 并点击 self.Ads.push(data)。什么都没有。
    • 查看编辑,您必须先映射您的数据,然后再将其推送到您的阵列。您当前正在将原始数据推送到您的可观察数组。
    • 从您的问题来看,您似乎已经尝试了我的解决方案:(您可以发布从您的服务器返回的 JSON 示例吗?它是一个对象还是一个数组?
    • 对不起,我没有看到你的模型。看起来它是一个数组,因此您必须遍历每个条目。见编辑 3...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2012-03-28
    • 1970-01-01
    • 2018-04-26
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多