如何通过ajax调用在knockout js中填充数据

时间:2014-09-01 08:45:30

标签: javascript ajax json knockout.js knockout-mapping-plugin

我有一个json对象,我从servlet响应淘汰js。我想在我的视图模型中初始化这些数据,因为我正在编写这段代码。

success: function (data) 
{ 
    var jsondata = data['jsonObj'];
    self.PopulateStates = ko.computed(function(){
        ko.utils.arrayForEach(jsondata, function(item){
            self.States.push(new State(item));
        });
    }); 
}, 
error: function (exception) 
{ 
    alert( "fail" ); 
} 
});

我的json对象字符串看起来像这样

{data:[{"id":"5345345","name":"dsfsdf","ssc":"","bic":"dgffdgfdg"},{"id":"123456","name":"SBI","ssc":"654321","bic":"vxvxc"}]}

js小提琴链接是demo 我的错是什么?或者我是否需要通过映射knockout js插件来实现?

1 个答案:

答案 0 :(得分:0)

我使用这个敲除扩展,在使用前声明。

ko.observableArray.fn.map = function (data, Constructor) {
    var mappedData = ko.utils.forEach(data, function () {
        return new Constructor(data);
    });

    this(mappedData);

    return this;
}

然后在我的$.ajax请求中执行此操作:

success: function (data) 
{ 
    var jsondata = data['jsonObj'];
    self.PopulateStates = ko.observableArray().map(data, State);
}); 

您的结果是computed可观察到的,并不是您需要的。

我注意到的另一件事是你的jsondata是使用从GET返回的数据设置的。你问的是jsonObj字段的数据,但是看着你的JSON,你似乎没有这个字段。我认为你说data作为要返回的项目列表的字段是正确的。

如果在您的视图模型中,您已经宣布了self.PopulateStates,我猜你有。你可以这样做:

var State = function (data) {
    var self = this;

    self.property = ko.observable().set(data, "property");
}

var viewModel = function () {
    var self = this;
    self.PopulateStates = ko.observable();

    function getStates() {
        var request = $.ajax();

        request.done(function (data, msg) {
            if (data) self.PopulateStates.map(data, State);
        });
    }
}

如果您在State模型中注意到我self.property使用自定义observable功能进行设置。所有这一切都是为了设置属性的数据,设置它。否则给它一个默认值。当我希望它使用数据为我构造一个对象时,我还有第三个参数。这是我说的一个联系人,modifiedBy属性,这个modifiedBy是一个用户对象(或只是一个复杂的对象)

<强> 修改

主要的不是错误,但并非必要包含jQuery。 Knockout可以独立于jQuery工作,因此您可以$(document).ready(function () {})确保在DOM上加载这些内容并不是必需的。这意味着如果页面不需要,您不必包含jQuery

以下是更新fiddle,现在可以使用了!