我的学习应用程序中有以下示例代码。该服务完成了他的工作,并使用php生成的json代码从页面中提取了一些数据,到目前为止一直很好。
服务
(function() {
'use strict';
angular
.module('app.data')
.service('DashboardService', DashboardService);
DashboardService.$inject = ['$http'];
function DashboardService($http) {
this.getFormules = getFormules;
////////////////
function getFormules(onReady, onError) {
var formJson = 'server/php/get-formules.php',
formURL = formJson + '?v=' + (new Date().getTime()); // Disables cash
onError = onError || function() { alert('Failure loading menu'); };
$http
.get(formURL)
.then(onReady, onError);
}
}
})();
然后我在我的控制器中调用getFormules函数,并将所有数据放在我的$ scope.formuleItems中,并测试一切是否成功,并且“不是...... $scope.formuleItems = undefined!
- 奇怪,因为我的观点是显示数据?
控制器的一部分:
dataLoader.getFormules(function (items){
$scope.formuleItems = items.data;
});
console.log('+++++++++++++++++', $scope.formuleItems); // gives undefined
我做的第一件事就是在stackoverflow上搜索一下,看看其他人是否有同样的问题,并且有:Undefined variable inside controller function。
我知道有一些解决方法,我已完成自己的研究,但有些事情告诉我,这(见下面的例子)并不是解决这个问题的最佳方法。
解决方案一:将$ watch置于控制器内
$scope.$watch('formuleItems', function(checkValue) {
if (checkValue !== undefined) {
//put the code in here!
}
}
甚至:
if($scope.formuleItems != null) {}
控制器的其余部分依赖于$ scope.formuleItems。我是否真的必须将所有内容都放入$watch
或if
?我可以用承诺解决这个问题吗?我从来没有这样做过,所以一些帮助会受到赞赏。
答案 0 :(得分:1)
回调中的代码
function (items){
$scope.formuleItems = items.data;
}
是异步评估的。这意味着你首先激活请求,然后javascript继续执行你的代码行,因此执行
console.log('+++++++++++++++++', $scope.formuleItems); // gives undefined
此时尚未调用回调,因为这需要一些时间,并且可能在任何时候发生。此操作不会停止执行。 因此,$ scope.formuleItems的值当然仍未定义。
之后 - 在未来的某个未定义的时间(可能在几毫秒之后),将调用回调并更改$ scope.formuleItems的值。您必须记录回调函数的INSIDE值。
如果你想在JavaScript中取得成功,你迫切需要理解这个概念,因为这种情况一次又一次地发生:)