如何确保$ scope.property在使用之前具有值

时间:2016-11-18 21:53:35

标签: javascript angularjs ajax asynchronous

我有一个带有两个$ scope属性的Angular控制器:

 $scope.details = ortabilityService.detail();

 $scope.treeViewOptions = {           
            dataSource: new kendo.data.HierarchicalDataSource({
                data: $scope.details               
        };

正如我们所看到的,树视图选项依赖于在将其用作数据源之前要解析的细节。现在,问题是它是一个异步调用,它总是不能保证它在treeviewOptions中使用之前已被解析。因此,它是一种非常不可靠的负载,有时会加载并且不会加载一些时间。如何确保$ scope.details在treeViewOptions中使用之前有值?

4 个答案:

答案 0 :(得分:2)

目标不是在使用它之前确保它有一个值,而是确保当它获得它的值时,页面会更新。

你可以使用手表或承诺来做到这一点。

$scope.details = ortabilityService.detail();

$scope.$watch('details', function(newValue, oldValue) {
  $scope.treeViewOptions = {           
        dataSource: new kendo.data.HierarchicalDataSource({
            data: newValue               
    };
});

答案 1 :(得分:2)

如果detail()返回承诺,您可以执行以下操作:

ortabilityService.detail().then(function(result) {
  $scope.details = result;

  $scope.treeViewOptions = {           
    dataSource: new kendo.data.HierarchicalDataSource({
      data: $scope.details               
    })
  };
});

修改

正如所指出的那样,ortabilityService.detail().$promise.then适用于这种情况。

答案 2 :(得分:0)

我发现有角度的剑道可以很好地兑现承诺: AngularJS : Where to use promises? 一些伪代码可能是:

Range("B:C,F:G,I:L,N:N").EntireColumn.Hidden = True

或者您可以加载剑道数据,例如

$scope.ctrl.details.$promise.then(function (results) {

   $scope.treeViewOptions = {           
            dataSource: new kendo.data.HierarchicalDataSource({
                data: results               
        };   
}

答案 3 :(得分:0)

考虑ortabilityService.detail()返回一个承诺

ortabilityService.detail().then(
    function success(result){
        $scope.treeViewOptions = {           
            dataSource: new kendo.data.HierarchicalDataSource({
                data: result              
            });
    }, 
    function error(result){
        //when it fails to load
    }
);