Javascript 敲除JS无法访问observableArray的元素

Javascript 敲除JS无法访问observableArray的元素,javascript,knockout.js,oracle-jet,Javascript,Knockout.js,Oracle Jet,我已经创建了敲除可观察数组并添加了如下元素 define(['ojs/ojcore', 'knockout', 'jquery', 'ojs/ojtable', 'ojs/ojarraytabledatasource', 'ojs/ojrouter'], function(oj, ko, $) { function CustomerViewModel() { var self = this; self.data = ko.observableArray([])

我已经创建了敲除可观察数组并添加了如下元素

define(['ojs/ojcore', 'knockout', 'jquery', 'ojs/ojtable', 'ojs/ojarraytabledatasource', 'ojs/ojrouter'],
 function(oj, ko, $) {

    function CustomerViewModel() {
      var self = this;
      self.data = ko.observableArray([]);

      var getDataUrl = <rest-api-url>
      var fetchDataPayLoad = JSON.stringify(<json_data>);

      self.fetchData = function(fetchDataPayLoad, fetchDataCallBack) {
             $.ajax({
               url: getDataUrl,
               data: fetchDataPayLoad,
               type: 'POST',
               contentType: 'application/json',
               success: fetchDataCallBack,
               error: function (jqXHR, textStatus, errorThrown) {
                 console.log('Error during fetch');
               }
             });
           };

      function fetchDataCallBack(fetchedData){
             fetchedData.hits.hits.forEach(function(e){
                 var value1 = e._id;
                 value2 = e._value;
                 value3 = e.name;
                 value4 = e.testdata;
                 self.data.push({
                   prop1: value1,
                   prop2: value2,
                   prop3: value3,
                   prop4: value4
                 });
               });
             });
           };
           var fetchDataRun = this.fetchData(fetchDataPayLoad, fetchDataCallBack);
           console.log(self.data());
}
    return new CustomerViewModel();
}
);
当我扩展时

>0: {prop1: "value11", prop2: "value12", prop3: "value13", prop4: "value14"}
>1: {prop1: "value21", prop2: "value22", prop3: "value23", prop4: "value24"}

不确定此处有何错误/遗漏,我可以知道如何访问observableArray元素吗?

更改
控制台的位置。log

function fetchDataCallBack(fetchedData){
    fetchedData.hits.hits.forEach(function(e){
        var value1 = e._id;
        value2 = e._value;
        value3 = e.name;
        value4 = e.testdata;
        self.data.push({
            prop1: value1,
            prop2: value2,
            prop3: value3,
            prop4: value4
        });
    });
    console.log(self.data());
});

Ajax调用是异步的,这意味着回调函数仅在调用完成后执行。当前您使用的是
console.log
,而Ajax调用仍在后台运行,因此显示为空。有关直观的说明,请参阅。

更改
控制台的位置。日志

function fetchDataCallBack(fetchedData){
    fetchedData.hits.hits.forEach(function(e){
        var value1 = e._id;
        value2 = e._value;
        value3 = e.name;
        value4 = e.testdata;
        self.data.push({
            prop1: value1,
            prop2: value2,
            prop3: value3,
            prop4: value4
        });
    });
    console.log(self.data());
});

Ajax调用是异步的,这意味着回调函数仅在调用完成后执行。当前您使用的是
console.log
,而Ajax调用仍在后台运行,因此显示为空。请参阅以获得直观的解释。

我不熟悉KO,但为什么在数据不是函数时调用它?console.log(self.data().length);您在什么范围内运行此代码?它在函数中吗?我找不到这段代码有任何问题,我做了一些检查,无法重现错误。您可以在runkit网站上传示例吗?因为您是从“self”对象作为函数调用数据,这可能会导致一些问题,因为作为函数的数据有其自己的属性,它尝试使用“this”关键字访问这些属性,一旦您通过“self”对象调用数据函数,您就可以寻址“this”的“self”对象引用“data”函数中正在使用的关键字,请尝试用以下内容替换打印行:
console.log(self.ob.call(self.ob.length)
请告诉我它是否适合您。@Lihai正如您建议的那样,我尝试了
console.log(self.data.call(self.data.length))也不起作用。我已经用整个viewModel更新了这个问题。哦,我明白了,它当然不起作用,ajax请求是异步的,这意味着行
console.log(self.data())未被前一行阻止:
var fetchDataRun=this.fetchData(fetchDataPayLoad,fetchDataCallBack)
并且在输出数组时,由于异步请求未解析,该数组为空。您需要做的是创建一个Promise对象,如下所示:
var Promise=newpromise(…)
对于ajax请求,将打印行放入
Promise.then(function(){…})我不熟悉KO,但为什么在数据不是函数时调用它?console.log(self.data().length);您在什么范围内运行此代码?它在函数中吗?我找不到这段代码有任何问题,我做了一些检查,无法重现错误。您可以在runkit网站上传示例吗?因为您是从“self”对象作为函数调用数据,这可能会导致一些问题,因为作为函数的数据有其自己的属性,它尝试使用“this”关键字访问这些属性,一旦您通过“self”对象调用数据函数,您就可以寻址“this”的“self”对象引用“data”函数中正在使用的关键字,请尝试用以下内容替换打印行:
console.log(self.ob.call(self.ob.length)
请告诉我它是否适合您。@Lihai正如您建议的那样,我尝试了
console.log(self.data.call(self.data.length))也不起作用。我已经用整个viewModel更新了这个问题。哦,我明白了,它当然不起作用,ajax请求是异步的,这意味着行
console.log(self.data())未被前一行阻止:
var fetchDataRun=this.fetchData(fetchDataPayLoad,fetchDataCallBack)
并且在输出数组时,由于异步请求未解析,该数组为空。您需要做的是创建一个Promise对象,如下所示:
var Promise=newpromise(…)
对于ajax请求,将打印行放入
Promise.then(function(){…})