Подтвердить что ты не робот

ES6 angular -meteor ng-table Функция getData, не вызываемая

Я пытаюсь реорганизовать свой код на ES6. Я использую angular -meteor и ng-table. Перед рефакторингом данные отображаются в таблице. Однако после рефакторинга синтаксиса ES6 данные больше не отображаются. Это фрагмент реорганизованного кода:

class MyController {
    constructor($scope, $reactive, NgTableParams, MyService) {
        'ngInject';

        $reactive(this).attach($scope);

        this.subscribe('myCollection');

        this.myService = MyService;

        this.helpers({
            items() {
                return this.myService.getItems();
            },
            itemTableParams() {
                const data = this.getReactively('items');

                return new NgTableParams({
                    page: 1,
                    count: 10
                }, {
                    total: data.length,
                    getData: (params) => {
                        // not called
                    }
                });
            }
        });
    }
}

class MyService {
    getItems() {
        return MyCollection.find({}, {
            sort: {
                dateCreated: -1
            }
        });
    }
}

export default angular.module('MyModule', [angularMeteor, ngTable, MyService])
    .component('MyComponent', {
        myTemplate,
        controllerAs: 'ctrl',
        controller: MyController
    })
    .service('MyService', MyService);

Запущен const data, но getData не вызван. Таблица в шаблоне использует ctrl.itemTableParams как значение для атрибута ng-table, а его ng-repeat - item in $data.

Есть ли у кого-нибудь идея, почему функция getData не вызывается? Помощь будет принята с благодарностью. Спасибо!

P.S. Когда я пытаюсь установить NgTableParams на const tableParams, а затем вызывать функцию reload(), срабатывает getData. Но дело в том, что это не отображение данных на столе. Я установил таблицу как:

itemTableParams() {
    const data = this.getReactively('items');
    const tableParams = new NgTableParams({
        page: 1,
        count: 10
    }, {
        total: data.length,
        getData: (params) => {

        }
    });

    tableParams.reload(); // triggers the getData function
    return tableParams;
}


<table ng-table="ctrl.itemTableParams">
    <tr ng-repeat="item in $data track by $index">
        <td>{{item.id}}</td>
        <td>{{item.name}}</td>
        <td>{{item.dateCreated}}</td>
    </tr>
</table>

Когда я регистрирую данные в getData, в нем есть элементы. Но, как я уже сказал, это не рендеринг в таблице.

4b9b3361

Ответ 1

По-видимому, вам просто нужно вернуть данные в getData. Старые документы использовали $defer.resolve и не возвращали разрешенные данные. Текущая версия (1.0.0) больше не использует ее.

this.helpers({
  items() {
    return this.myService.getItems();
  },
  itemTableParams() {
    const data = this.getReactively('items');

    return new NgTableParams({
      page: 1,
      count: 10
    }, {
      total: data.length,
      getData: (params) => {
        const filteredData = filterData(data); // do something

        return filteredData;
      }
    });
  }
});

Ответ 2

Метод getData не вызывается, потому что вы извлекаете data асинхронно, но используете его синхронно. Поэтому, когда контроллер загружается изначально, getData вызывается с неразрешенными данными.

Чтобы исправить это, вам нужно создать NgTableParams в обратном вызове успеха объекта data:

data.$promise.then((data) => {
 // create NgTableParams here
});