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
, в нем есть элементы. Но, как я уже сказал, это не рендеринг в таблице.
Ответы
Ответ 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
});