如何将异步调用返回的 Json 数据正确绑定到敲除 observableArray

How to bind Json data returned by a asynchronous call to a knockout observableArray correctly

我正在尝试通过 ajax 调用获取一个 json 对象,并将其放入一个 knockout observable 中。

var self = this;
this.arnVal = ko.observableArray([]);

var promise = $.getJSON('../../url/to/my/api');

promise.done(function(data) {
         console.log(data);
         console.log(data["metricValues"]);                
         self.arnVal().push(data["metricValues"]);
         console.log(self.arnVal());                                     
      });

promise.done() 函数调用中的控制台日志正确打印​​了预期值。也就是说,数据采用我绑定它的 Oracle Jet 组件所期望的正确数组格式。

此代码位于 Knockout 组件 javascript 文件中,我在其他地方的 HTML 文件中将其用作 Knockout 组件的一部分。 在组件的 HTML 文件中,我使用 arnVal 填充 Oracle Jet 图表。

但是图表永远不会填充从 getJSON 调用中获得的更新的 arnVal 数据。

我做错了什么?

只需删除 self.arnVal().push(...) 中多余的括号即可。

self.arnVal.push(data["metricValues"]);

目前 parens 正在拆箱 observable 数组并将新项目推送到基础 javascript 数组。这绕过了淘汰赛的事件触发器。

去掉这里的括号:

self.arnVal().push(data["metricValues"]);
         //^^ here

查看规范:http://knockoutjs.com/documentation/observableArrays.html

var myObservableArray = ko.observableArray(); // Initially an empty array myObservableArray.push('Some value'); // Adds the value and notifies observers

原因是 self.arnVal 是一个可观察数组,而 self.arnVal() 是一个简单数组(没有通知功能)。