使用JSON时,knockout计算对象不起作用

时间:2014-10-27 18:16:22

标签: javascript jquery json knockout.js

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

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

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

感谢您的帮助,谢谢

1 个答案:

答案 0 :(得分:0)

您当前的方法存在一些问题:

您需要修复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函数的数组,它不会进行任何类型的映射。您需要在map阵列上致电objs

 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