如何等待ng-repeat中的服务响应

时间:2016-02-24 15:16:03

标签: angularjs

我正在尝试使用ng-repeat显示项目,当列表初始加载时,尝试调用另一个服务以获取有关第一个项目的详细信息。 这是我的代码:

play(JNIEnv* env, jclass clazz, jint which, jint count, jdouble freqOfTone)
{
    unsigned i;
    int j = 0;
    double sampleRate = SAMPLERATE/freqOfTone;
    switch (which) {
case SINE:
        for (i = 0; i < TONE_FRAMES; ++i) {
            toneBuffer[i] = sin(2.0*M_PI * i/sampleRate) * 32768;                
        }
        nextBuffer = createResampledBuf(SINE, SL_SAMPLINGRATE_8, &nextSize);
        if(!nextBuffer) {
            nextBuffer = (short*) toneBuffer;
            nextSize  = sizeof(toneBuffer);
        }
        break;
    }
    nextCount = count;
    if (nextSize > 0) {
        SLresult result;
        result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);
        if (SL_RESULT_SUCCESS != result) {
            bqPlayerRecorderBusy = 1;
            return JNI_FALSE;
        }
    }

    return JNI_TRUE;
}

在控制器中:

<div ng-repeat="item in itemList">
    <div ng-click="setCurrentItem(item,$index)" ng-init="initCurrentItem(item,$index)">
       item.id
    </div>
</div>

从这项服务我得到以下数据:

function init(){    
  itemService.loadItem();    
}

$scope.itemList = function(){
  return itemService.getItemsList();
} 

我正在调用另一个服务来获取itemDetails。

itemName:x001,
item.id:10
itemName:x002,
item.id:20,
itemName:x003,
item.id:30.

当列表加载initailly并调用initCurrentItem时,currentItemDetails保存最后一项(itemName:x003,id:30)。 ng-repeat重复这些值而不等待服务的响应。我如何在循环中等待,直到我收到第一项的回复?

1 个答案:

答案 0 :(得分:2)

只需在init方法中使用与其他示例中相同的逻辑 - 使用.then(等。并为重复变量 itemList 指定值。然后,当数据到达时,表格HTML将自动刷新,并且将解决Promise:

<div ng-repeat="item in itemList">

function init(){    
  itemService.loadItem().then(function(response){
      if(angular.isDefined(response)){
        $scope.itemList = response.data;
      }
    });   
}

<强> UPD

在加载数据后尝试调用initCurrentItem

function init(){    
  itemService.loadItem().then(function(response){
    if(angular.isDefined(response)){
      $scope.itemList = response.data;
//here we iterate received array $scope.itemList and call initCurrentItem on each of them
      $scope.itemList.forEach(function(item, i){
       $scope.initCurrentItem(item, i);
    });
   }
  });   
}