Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在从内部更新ng show。然后()_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript 正在从内部更新ng show。然后()

Javascript 正在从内部更新ng show。然后(),javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我有一个在异步服务调用完成时显示的加载程序,只想在完成时隐藏加载程序。这是我的控制器: app.controller('DataController', function($scope, DataService) { // UI state $scope.loading = true; DataService.getData({ "count": 10 }).then(function(data) { $scope.data = data;

我有一个在异步服务调用完成时显示的加载程序,只想在完成时隐藏加载程序。这是我的控制器:

app.controller('DataController', 
  function($scope, DataService) {
    // UI state
    $scope.loading = true;

    DataService.getData({ "count": 10 }).then(function(data) {
      $scope.data = data;

      // UI state
      $scope.loading = false; // does not update ng-view
      $scope.$apply(function() { // generates error
        $scope.loading = false;
      });
    });
});
以及以下观点:

<div ng-controller="DataController">
  <div id="container">
    <div>
      {{ loading }}
    </div>
    <div class="spinner large" ng-show="loading"></div>
    <div class="data-container" ng-show="!loading">
      ...
    </div>
  </div>
</div>
更新

由于这可能与承诺相关,下面是从
DataService
工厂生成
getData()
方法的承诺:

getData: function(params) {
  var deferred = $q.defer();
  APIService.data(params).then(function(data) {
    deferred.resolve(data);
  });
  return deferred.promise;
}
最后一部分是
APIService.data()
方法:

data: function(params) {
  var deferred = $q.defer();
  $resource(endpoint + '/data/feed', {}, {
    'query': { 
      method: 'POST',
      headers: headers
    }
  }).query(params).$promise.then(function(data) {
    deferred.resolve(data);
  });
  return deferred.promise;
}
尝试使用

$scope.$evalAsync(function() {
  $scope.loading = false;
});

我将通过将show/hide指令绑定到控制器中的data属性来解决这个问题。如果数据未定义,则与false相同

<div class="spinner large" ng-hide="data"></div>
<div class="data-container" ng-show="data">

发现了问题-由于这是一个Chrome扩展,我需要包含Angular CSS CSP文件,其中包含
ng hide
类定义。包含该文件导致代码按预期工作。谢谢大家的帮助。更多信息:


您不需要scope.apply。你的问题在别的地方。。这是控制器中的完整html吗?正如我所说的,在没有它的情况下尝试了它,并且视图的
ng show
部分没有更新-我缺少了一些其他内容?您是否有一个ng if,ng创建了一个封装该部分的子范围的内容?或者就是这样吗?除了更改专有服务名称/调用之外,就是这样。GetData返回promise的角度版本,对吗?它应该很好用。。检查这个好建议,旋转器没有被隐藏。啊,对不起。应该是相反的。更新的示例。如果填充了数据属性,则隐藏元素。
<div class="spinner large" ng-hide="data"></div>
<div class="data-container" ng-show="data">