为什么$ scope变量在一个函数中有值但在另一个函数中定义?

时间:2016-04-06 00:35:16

标签: javascript angularjs

初始化视图时调用isCheckedIn函数,单击按钮时调用checkin函数。

我不确定为什么,但$ scope.users_events未在isCheckedIn中定义,但其值为checkIn

我做错了什么?

这是两个功能

$scope.isCheckedIn = function() {
  console.log($scope.users_events);
  //more code
}

$scope.checkIn = function() {
  console.log($scope.users_events);
  //more code
}

这是变量来自

的函数
function getCheckedInUsers(){
  dataService.getCollectionForId('events', id, 'users')
  .then(function(response) {
        $scope.users = response.data.relatedObjects.users;
        $scope.users_events = response.data.data;
    });
}

getCheckedInUsers();

1 个答案:

答案 0 :(得分:0)

  

初始化视图时调用isCheckedIn函数,单击按钮时调用checkIn函数。

dataService.getCollectionForId('events', id, 'users')将返回Promise。传递到then的第一个函数将在Promise成功解析后执行。

此操作可能在视图初始化后发生,这就是为checkedIn工作但isCheckedIn不起作用的原因。

To" fix"这可以确保您在检索数据后重新评估计算表达式(而不是依赖于摘要周期),或者更一般地说,任何时候任何输入都发生了变化。我假设isCheckedIn正在进行其他有用的初始化,在这种情况下,可能应该在最后的then函数内调用它。

通常情况下,您只需使用指令或视图绑定(如{{ $scopeExpression }})来显示$scope上的值,该值会随着更改而保持最新...如果该表达式在时间上很昂贵计算(或需要调用服务)然后你需要做一些其他事情来保持摘要周期快速和应用程序响应。

例如,这里是一般问题的一般解决方案 - 如果你有一组计算需要在任何(1)输入改变时从各种输入源重新计算,假设输入是相对较小(如数字或短字符串)而不是数组(你只需要注意你如何定义"相等")你可以用(1)观察来做到这一点:

$scope.$watch(function () {
    return {
       input1: expression1,
       input2: expression2,
       // ... 
    }
}, function (value) {
   // This function will only execute if at least one of the inputs changed 

   var computations = [];
   computations.push(computationA(value.input1, value.input2 /* ,.. */));
   computations.push(computationB(value.input1, value.input2 /* ,.. */));
   computations.push(computationC(value.input1, value.input2 /* ,.. */));
   // ...

   $q.all(promises).then(function (computations) {
      $scope.computationAResult = computations[0];
      $scope.computationBResult = computations[1];
      $scope.computationCResult = computations[2];

      // Do synchronous work here on inputs so that all $scope variables get updated at once.
   });

}, true /* Deep watch */);

这样你就不会在每个摘要周期进行大量昂贵的计算。