【问题标题】:knockout computed object not working when working with JSON使用 JSON 时淘汰计算对象不起作用
【发布时间】:2014-10-28 02:50:23
【问题描述】:

我是 Knockout 的新手,问题是我尝试从 JSON 加载对象并使用计算值 请查看 jsfiddle 示例并告诉我我做错了什么 它应该显示“Hello World”+“开始日期”(在第三行) http://jsfiddle.net/qp86wbdt/3/

self.starttextt= ko.computed(function() {
    return  " Hello world " + this.start();
}, this);             

值得一提的是,这个计算对象存在于“事件”对象(从 json 加载)中,而“事件”对象存在于 ViewModel 对象中。

感谢您的帮助,谢谢

【问题讨论】:

  • 您永远不会映射到您的 Event 对象。遍历 JSON 数据并从每个项目创建事件并将其推送到 KO 事件数组,或使用映射插件。
  • 你好 MiBu 可以提供例子吗?

标签: javascript jquery json knockout.js


【解决方案1】:

您当前的方法存在很多问题:

您需要修复您的Event 函数以获取一些参数来填充数据:

 function Event(data) {
     var self = this;
     self.title = ko.observable(data.title);
     self.start = ko.observable(data.start);
     self.starttextt = ko.computed(function () {
         return " Hello world " + this.start();
     }, this);
 }

然后编写var data = [Event]; 只需使用Event 函数创建一个数组,它不会进行任何类型的映射。您需要在 objs 数组上调用 map

 var objs = JSON.parse(js);
 var data = objs.map(function (e) {
     return new Event(e)
 });

并且您需要在 viewModel 中使用 data 而不是 obj

 var viewModel = function () {
     var self = this;
     self.events = ko.observableArray(data);
 };

演示JSFiddle.

但是您不需要编写所有这些映射代码,因为已经存在一个名为 Mapping plugin 的插件来处理这些情况。

这是用映射插件重写的示例:

 var mapping = {
     create: function (options) {
         var event = ko.mapping.fromJS(options.data);
         event.starttextt = ko.computed(function () {
             return " Hello world " + event.start();
         }, event);
         return event;
     }
 }
 var viewModel = function () {
     var self = this;
     self.events = ko.mapping.fromJSON(js, mapping);
 };

演示JSFiddle.

【讨论】:

  • 感谢您的详细回答,第一个解决方案对我有用,不胜感激
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多