所以这很奇怪。 $rootScope
在函数中正确设置,但随后失去其值。如果我使用诺言,我只能保留价值。 (!?)
我正在使用trigger.io(Forge)AJAX请求,并在成功时更新$rootScope.queries
。在成功模块中,$rootScope.queries
设置正确,如alert
所示。
.run(function($rootScope, $state, $q) {
var retrieveHistory = function() {
forge.logging.log("Retrieving history");
// Retrieve the history
forge.request.ajax({
type: 'GET',
url: 'http://localhost:9000/json',
dataType: 'json',
success: function (data) {
$rootScope.queries = data["queries"];
alert("queries " + JSON.stringify($rootScope.queries));
},
error: function (error) {
}
});
}
retrieveHistory();
此时,在调用retrieveHistory()
后,$rootScope.queries
现在为空。视图未更新,并且使用Chrome控制台检查显示它是空的。
假设我在函数中添加了一个承诺,但实际上并没有使用承诺。
.run(function($rootScope, $state, $q) {
var retrieveHistory = function() {
var deferred = $q.defer();
forge.logging.log("Retrieving history");
// Retrieve the history
forge.request.ajax({
type: 'GET',
url: 'http://localhost:9000/json',
dataType: 'json',
success: function (data) {
$rootScope.queries = data["queries"];
alert("queries " + JSON.stringify($rootScope.queries));
},
error: function (error) {
deferred.reject("error " + JSON.stringify(error));
}
});
return deferred.promise;
}
var promise = retrieveHistory();
promise.then();
有了这个承诺,$rootScope.queries
保持其价值。视图更新和Chrome检查器会显示正确设置的值。
这是为什么?我根本不明白这种行为。为什么我不能在原始代码中保留$rootScope.queries
的值?为什么承诺保持价值?
答案 0 :(得分:2)
你的问题怎么可能是forge.ajax在角度消化之外,所以你需要执行。
$rootScope.$apply()
让rootcope知道他需要知道一些人需要知道