价值并不总是角

问题描述:

解释我有一个控制器,像这样:价值并不总是角

controller.things = ['a', 'b', 'c']; 
controller.loading = true; 
controller.responses = []; 

controller.handlePromises = function(){ 
    var promises = []; 

    for(promiseIndex = 0; promiseIndex < controller.things.length; promiseIndex++) { 
     promises.push(controller.promise(things[promiseIndex]); 
    } 

    Promise.all(promises).then(function success(response){ 
     for(responseIndex = 0; responseIndex < response.length; responseIndex++){ 
      responses.push(response[responseIndex].data); 
     } 
     controller.loading = false; 
    } 
} 

controller.promise = function(value){ 
    //Some $http request to Database; 
} 

controller.handlePromises(); 

controller.things的东西量取决于用户。连接到这是做一个简单的HTML页面如下:

<div ng-if="!controller.loading"> 
    <div ng-repeat="response in controller.responses"> 
     {{response}} 
    </div> 
</div> 

我的问题是,有一个50/50的机会的内容变得可见,其他时间我可以看到,该承诺具有调试器已解决并且加载设置为false,但ng-if一直隐藏内容。即使显示内容,ng-repeat很有可能说controller.responses仍然是空的。

无论需要多长时间,我如何保证ng-if在承诺解决时接受controller.loading为假?此外,ng-repeat的相同问题有时也不会在controller.responses中看到值。我考虑过超时,但这不是理想的解决方案,因为它可能需要半秒到十秒的时间。

+0

是否所有承诺成功吗?您的Promise.all(...)只有成功回调。我猜想,如果一个或多个承诺失败,你最终不会成功回调。 – mortb

+0

该示例假定所有承诺都已成功解决,但实际的完整实现有故障回退。 – Patrick

+0

您是否尝试使用$ digest.apply()或$ scope.apply()。很可能UI不会更新范围已更改。 –

问题是您正在使用Promise.all而不是$q$q是由Angular团队构建的Promise库,它将为您执行$digest周期。

$q.all(promises).then(function success(response) { 
    for (responseIndex = 0; responseIndex < response.length; responseIndex++) { 
    responses.push(response[responseIndex].data); 
    } 
    controller.loading = false; 
}); 

Read more about $q