【问题标题】:How to populate data in knockout js through ajax call如何通过ajax调用填充淘汰js中的数据
【发布时间】:2014-10-25 10:57:18
【问题描述】:

我有一个 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的映射插件来实现?

【问题讨论】:

  • self.PopulateStatescomputed observable是什么意思?
  • 是计算可观察

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


【解决方案1】:

我使用这个淘汰赛扩展,在使用前声明。

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 observable 中得到了结果,这不是你所需要的。

我注意到的另一件事是,您的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,现在可以使用了!

【讨论】:

  • 它不起作用我收到错误 undefine is not a function。我你的ajax请求你在哪里传递参数?函数 getStates() { var request = $.ajax(); request.done(function (data, msg) { if (data) self.PopulateStates.map(data, State); }); }
  • 您需要使用您的ajax 设置,我显然没有放入任何设置,因为这取决于您的设置。如果您在其中创建一个带有脚本的小提琴。然后我可以进行修改以向您展示它是如何工作的
  • 刚刚看到您的其他评论,现在为您制作小提琴。
  • jsfiddle.net/sohimohit/gz0s6413 它是小提琴的链接,我想在加载时填充一些数据
  • 我仍然收到错误 undefiened is not a function
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2012-07-27
  • 1970-01-01
  • 2014-02-04
  • 2020-02-17
  • 2018-03-22
相关资源
最近更新 更多