ES6 angular-meteor ng-table getData 函数未调用

Posted

技术标签:

【中文标题】ES6 angular-meteor ng-table getData 函数未调用【英文标题】:ES6 angular-meteor ng-table getData function not called 【发布时间】:2017-01-20 23:57:35 【问题描述】:

我正在尝试将我的代码重构为 ES6。我正在使用 angular-meteor 和 ng-table。在重构之前,数据显示在表格中。但是,在重构为 ES6 语法后,数据不再显示。这是重构代码的sn-p:

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-repeatitem in $data

有人知道为什么不调用getData 函数吗?帮助将不胜感激。谢谢!

附: 当我尝试将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 中记录数据时,其中包含项目。但是,就像我说的,它没有在表格中呈现。

【问题讨论】:

控制台中是否出现任何错误?您的items 方法调用this.myService.getItems(),但服务有一个方法getInputs,而不是getItems。这是在 SO 问题中的错字还是在您的实际应用中也是如此? @noppa 抱歉,这是问题中的拼写错误,而不是应用程序。 【参考方案1】:

getData 方法未被调用,因为您异步获取 data 但同步使用它。因此,当最初加载控制器时,getData 会使用未解析的数据调用。

要解决此问题,您需要在 data 对象的成功回调中创建 NgTableParams

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

【讨论】:

这对angular-meteor 有效吗?我试过这样做,$promise 未定义。【参考方案2】:

显然,您只需返回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;
      
    );
  
);

【讨论】:

以上是关于ES6 angular-meteor ng-table getData 函数未调用的主要内容,如果未能解决你的问题,请参考以下文章

初识Angular-Meteor(Angular-Meteor使实时全栈更简单)

Angular-Meteor - 如何在基于包的设计中包含 ng 模板?

angular-meteor 根据参数查找 MongoDb 集合并返回

在 Meteor 1.3 + angular1 上使用 npm(凹凸!)

Meteor Angular UI.Router 链接的语法要求是啥?

Angular ngTable