【问题标题】:Angularjs cannot add data service response to scope variableAngularjs 无法将数据服务响应添加到范围变量
【发布时间】:2014-09-13 01:25:58
【问题描述】:

我的控制器中有一个函数,它为数据请求数据服务,我试图添加到当前范围变量,但它给了我未定义的错误

$scope.affiliates = d.data;
            if (isNaN($scope.affiliate_id)){
                var i = 0;

               while (i < $scope.affiliates.length){


                   var affiliate_id = $scope.affiliates[i].affiliate_id.replace(/["']/g, "");
                   DataService.getAffiliateConversionApiService(affiliate_id).then(function(apiData){

                      $scope.affiliates[i].apiData = apiData;//ERROR IN HERE
                   });
                   i++;
               }
            }

TypeError: $scope.affiliates[i] 未定义

我也尝试过从 dataService 返回数据并将其设置在外部,但它总是返回空。 我该如何解决这个问题?

【问题讨论】:

  • 您是否尝试过 forEach 而不是一段时间?这可能是关联公司的密钥不可用。
  • 对 d.data 做一个控制台日志,看看你得到了什么,看起来你没有得到一个数组对象,或者如果你这样做了,你得到它是空的。

标签: javascript angularjs


【解决方案1】:

不要忘记 getAffiliateConversionApiService 正在返回一个承诺(这意味着它是一个 async 操作)因此您的 while 块将针对每个可能的 i 值执行 before 你甚至可以从getAffiliateConversionApiService 获得结果。

假设$scope.affiliates.length6。当您在then 中的回调代码被执行时,您的i 将是7

一种解决方案是使用angular.forEach 而不是while。但是,如果您仍想使用 while,则需要将 i 值存储在另一个变量中:

while (i < $scope.affiliates.length){
  var index = i;
  var affiliate_id = $scope.affiliates[i].affiliate_id.replace(/["']/g, "");
  DataService.getAffiliateConversionApiService(affiliate_id).then(function(apiData){
    $scope.affiliates[index].apiData = apiData;
  });
  i++;
}

【讨论】:

  • 现在更有意义了@bmleite。谢谢
【解决方案2】:

这不是一个真正的答案,但这里有一些调试可以帮助你。 另外,我从使用 while 循环切换到使用 angular 的 forEach

$scope.affiliates = d.data;
        if (isNaN($scope.affiliate_id)){
           console.log($scope.affiliates); // what does this return?

           angular.forEach($scope.affiliates, function(value, index){
               console.log(value); // output the affiliate, if any

               var affiliate_id = value.affiliate_id.replace(/["']/g, ""); 
               DataService.getAffiliateConversionApiService(affiliate_id).then(function(apiData){
                  console.log(apiData); // see what is returned
                  $scope.affiliates[index].apiData = apiData; // still an error?
               });
           });
        }

【讨论】:

  • 非常感谢,它成功了。但我唯一不明白的是为什么 foreach 会工作而不是 while 循环,因为它们做的事情几乎相同
  • @AsifAlamgir 请检查我的答案,如果它有助于理解 whileforEach 的区别,请告诉我
猜你喜欢
  • 2014-01-24
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
相关资源
最近更新 更多