2015-10-29 23 views
0

我不知道是什么问题,但似乎数据表指令正在我的$范围被定义之前被初始化。更重要的是,似乎变量设置了两次。

我有一个userService从我的服务器检索列定义和数据。 getUserList()方法返回一个承诺。我使用then()方法来设置将由datatables指令使用的$ scope变量。看起来指令在请求完成之前请求变量。此外,似乎变量设置了两次,因为在Chrome的开发控制台中,我看到“测试”日志两次。

如果我使用静态数据(不是来自服务器)并将$ scope变量放在getUserList()之外,那么它可以正常工作。

$scope.indexList = function() { 
       userService.getUserList().then(function (data) { 


        $scope.dtOptions = DTOptionsBuilder.fromFnPromise(function() { 
         console.log("test"); 
         var deferred = $q.defer(); 
         deferred.resolve(data.Data); 
         return deferred.promise; 
        }); 
        $scope.dtColumns = []; 

        angular.forEach(data.DataTablesColumns, function (i, v) { 
         $scope.dtColumns.push(DTColumnBuilder.newColumn(i.Id) 
               .withTitle(i.DisplayName) 
               .renderWith(actionsHtml)); 
        }); 

       }); 
      } 

这是我如何设置数据表指令:

<div ng-init="indexList()"> 
     <table datatable="" dt-options="dtOptions" dt-columns="dtColumns"class="row-border hover"></table> 
    </div> 

回答

1

的指令代码被尽快执行的页面加载。由于您的$ scope变量是在promise中定义的,因此它们在页面加载时不可用。

指令不会等待请求完成,因为请求本质上是异步的。如果你想指令变量要更新的请求完成时你必须设置一个$watch(或$ watchGroup如果你想观看多个变量)在你的链接功能的$ scope.variables如下:

link: function(scope, element, attrs) { 
    scope.$watch('dtOptions', function(newval, oldval) { 
     //your directive code involving scope variables here. 
    }) 
} 
+0

我可以在不修改指令的情况下做类似的事吗? – DDiVita

+0

我没有看到另一种方式......也许某种延迟的指令初始化,但我不知道这是否可能。 –

0

看来我必须打2个电话给我的服务器来做我以后的事情。这很有效,但我觉得应该有一种方法可以对服务器进行一次调用,然后获得整个结果。经过一些阅读后,选项和列建设者可以承诺。

$scope.indexList = function() { 


      $scope.dtOptions = DTOptionsBuilder.fromFnPromise(function() { 
       return userService.getUserList(ngRequestGlobabls.context.organization).then(function(data) { 
        return data.Data; 
       }); 
      }); 


      $scope.dtColumns = userService.getUserList(ngRequestGlobabls.context.organization).then(function (data) { 
       columns = []; 
       angular.forEach(data.DataTablesColumns, function(i, v) { 
        columns.push(DTColumnBuilder.newColumn(i.Id).withTitle(i.DisplayName).renderWith(actionsHtml)); 
       }); 

       return columns; 
      });