代码之家  ›  专栏  ›  技术社区  ›  Dave

ServiceNow:ngTable无法从服务器获取要加载的数据

  •  0
  • Dave  · 技术社区  · 5 年前

    在我们的客户端脚本中,我们有total:c。onbCase.长度,并且不确定这是为什么会产生错误。我们是不是少了点什么?

      <div class="panel panel-default" style="margin-bottom:200px;">
          <div class="panel-heading">
            <span class="panel-title"><i class="fa fa-{{c.glyph}}" aria-hidden="true"></i>&nbsp; {{c.title}}</span>
          </div>
    
          <div class="panel-body" ng-if="c.data.loading">
            <span><i class="fa fa-spinner fa-spin fa-3x fafw"></i>
              <span class="sr-only">Loading...</span>
            </span>
          </div>
    
          <div class="panel-body table-responsive" ng-if="!c.data.loading">
            <h4 ng-if="c.options.filter">Table Filter: {{c.options.filter}}</h4>
            <table id="print_table" class="display table table-striped table-hover" ng-table ="usersTable" show-filter=true>
              <tr ng-click="c.onWidget('batch_qa_form_list',item.sys_id, item.short_description);" 
                  ng-repeat="item in c.onbCase track by $index" 
                  ng-if="item.case_visible">
                <td ng-show="c.options.case_number" data-title="{{item.number}}" sortable="'number'" filter="{ 'number': 'text' }">{{item.number}}</td>
                <td ng-show="c.options.last_name" data-title="{{item.last_name}}" sortable="'last_name'" filter="{ 'last_name': 'text' }">{{item.last_name}}</td>
                <td ng-show="c.options.first_name" data-title="{{item.first_name}}" sortable="'first_name'" filter="{ 'first_name': 'text' }">{{item.first_name}}</td>
                <td ng-show="c.options.case_short_description" data-title="{{item.short_description}}" sortable="'short_description'" filter="{ 'short_description': 'text' }">{{item.short_description}}</td>
                <td ng-show="c.options.start_date" data-title="{{item.start_date}}" sortable="'start_date'" filter="{ 'start_date': 'text' }">{{item.start_date | date:'shortDate':'Z'}}</td>
                <td ng-show="c.options.work_location" data-title="{{item.location}}" sortable="'location'" filter="{ 'location': 'text' }">{{item.location}}</td>
                <td ng-show="c.options.form_review_status" data-title="{{item.form_review_status}}" sortable="'all_approved'" filter="{ 'all_approved': 'text' }">        
                  <i ng-if="item.all_approved=='All Forms Reviewed'" class="fa fa-check-circle fa-lg success"></i>
                  <i ng-if="item.all_approved=='Pending Review'" class="fa fa-exclamation-circle fa-lg warning" uib-tooltip="{{item.number_pending}} items pending review" tooltip-placement="left" title=""></i>
                </td>
              </tr>
            </table>
          </div>
        </div>
    
        function($scope, spUtil, spModal, $filter, ngTableParams) {
    
            var c = this;
    
            //Set value to show loading spinner
            c.data.loading = true;
    
            function initialize() {
                c.server.get({
                    action: 'retrieve_data'
                }).then(function(response) {
                    //Set value to hide loading spinner
                    c.data.loading = false;
    
                    //Get link data
                    c.onbCase = response.data.onbCase;
                });
            }
        initialize();
    
            $scope.usersTable = new ngTableParams({
                page: 1,
                count: 5
            }, {
                total: c.onbCase.length,
                getData: function ($defer, params) {
                    $scope.data = params.sorting() ? $filter('orderBy')(c.onbCase, params.orderBy()) : c.onbCase;
                    $scope.data = params.filter() ? $filter('filter')($scope.data, params.filter()) : $scope.data;
                    $scope.data = $scope.data.slice((params.page() - 1) * params.count(), params.page() * params.count());
                    $defer.resolve($scope.data);
                }
            });
    
            spUtil.recordWatch($scope, "x_dnf_federal_hr_o_federal_form_review", "", function(name, data) {
                initialize();
            });
        }
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Pop-A-Stash    5 年前

    这是一个典型的不理解JS承诺的顺序或操作的例子。你的 ngTable 在数据返回之前调用初始化。

    问题是你的电话 ngTableParams() 直接在 server.get 打电话。在控件移动到 .then() new ngTableParams() 调用一个函数,并在服务器调用完成后调用它。这是构建代码的正确方法:

      function initialize() {
        c.server.get({
          action: 'retrieve_data'
        }).then(function(response) {
          //Set value to hide loading spinner
          c.data.loading = false;
    
          //Get link data
          c.onbCase = response.data.onbCase;
    
          // don't run the ngTable init until the http call has returned
          ngTableInit();
        });
      }
      initialize();
    
      //wrap your ngTableParams constructor in a function
      function ngTableInit() {
          $scope.usersTable = new ngTableParams({
            page: 1,
            count: 5
          }, {
            total: c.onbCase.length,
            getData: function ($defer, params) {
              ...
            }
          });
    
       }
    

    如果在原始代码中在浏览器的调试器中设置断点,您将看到这一点 $scope.usersTable = new ngTableParams({...}) c.onbCase 未定义。