1

所以这很奇怪。$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();

虽然此时,afterretrieveHistory()已被调用,$rootScope.queries现在是空的。视图没有更新,使用 Chrome 控制台检查显示它是空的。

假设我向函数添加了一个 Promise,但实际上并没有将 Promise 用于任何事情。

.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原始代码中的值?为什么承诺会保持价值?

4

1 回答 1

2

好的,2个问题。

  1. 你为什么在 $http pr 资源上使用 trigger.ajax,这些资源是 Angular 本机服务,因此完全了解 angulars diges 循环而不是外部库的情况。
  2. 你为什么要使用 rootscope 你真的不应该这样做,除非你在服务中广播一个事件我知道没有充分的理由污染你的 rootscope。

你的问题很可能是因为 forge.ajax 在角度摘要之外,所以你需要执行。

$rootScope.$apply() 

让 rootscope 知道他需要注意一些变化

于 2014-05-22T19:39:59.210 回答