нокаут JS не может получить доступ к элементам observableArray - PullRequest
0 голосов
/ 27 сентября 2018

Я создал наблюдаемый массив и добавил элемент, как показано ниже:

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();
}
);

Когда я пытаюсь всегда проверять длину observableArray, получая 0, и когда я печатаю те же полученные данные, как показано ниже, на консоли,

>[]

и когда я расширяюсь,

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

Не уверен, что я делаю неправильно / отсутствует здесь, могу ли я узнать, как получить доступ к элементу observableArray?

1 Ответ

0 голосов
/ 27 сентября 2018

Изменить местоположение вашего console.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-вызов все еще выполняется в фоновом режиме, и поэтому он отображается как пустой.См. здесь для визуального объяснения.

...