初始化视图时调用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();
答案 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 */);
这样你就不会在每个摘要周期进行大量昂贵的计算。