除非我使用promise(trigger.io AJAX请求),否则AngularJS $ rootScope会丢失值

时间:2014-05-22 19:21:43

标签: angularjs angularjs-scope promise trigger.io angular-promise

所以这很奇怪。 $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的值?为什么承诺保持价值?

1 个答案:

答案 0 :(得分:2)

好的,2个问题。

  1. 为什么你在$ http pr资源上使用trigger.ajax是角度本地服务因此完全了解角度消化周期而不是外部库的情况。
  2. 为什么你使用的是rootcope,你真的不应该这样做,你在服务中广播一个事件,我知道没有充分的理由来支持你的rootcope。
  3. 你的问题怎么可能是forge.ajax在角度消化之外,所以你需要执行。

    $rootScope.$apply() 
    

    让rootcope知道他需要知道一些人需要知道