Angular.js - Digest不包括$ scope成员更改

时间:2014-08-25 04:05:46

标签: angularjs

我的服务包括:

  newStatusEvent = function(account, eventId, url, deferred, iteration) {
    var checkIteration;
    checkIteration = function(data) {
      if (iteration < CHECK_ITERATIONS && data.Automation.Status !== 'FAILED') {
        iteration++;
        $timeout((function() {
          return newStatusEvent(account, eventId, url, deferred, iteration);
        }), TIME_ITERATION);
      } else {
        deferred.reject('failure');
      }
    };

    url.get().then(function(data) {
      if (data.Automation.Status !== 'COMPLETED') {
        checkIteration(data);
      } else {
        deferred.resolve('complete');
      }
    });
     return deferred.promise;
  };

  runEventCheck = function(account, eventId, modalInstance, state) {
    newStatusEvent(account, eventId, urlBuilder(account, eventId), 
        $q.defer(), 0)
      .then(function() {
           scopeMutateSuccess(modalInstance, state);
      }, function() {
          scopeMutateFailure(modalInstance);
          })["finally"](function() {
          modalEventConfig.disableButtonsForRun = false;
      });
  };

  var modalEventConfig = {
    disableButtonsForRun: false,
    statusBar: false,
    nodeStatus: 'Building',
    statusType: 'warning'
  }

  function scopeMutateSuccess(modalInstance, state){
    /////////////////////////////////////////////////
    //THE SCPOPE DATA MEMBERS THAT ARE CHANGED BUT
    //CURRENT DIGEST() DOES NOT INCLUDE THE CHANGE
    modalEventConfig.statusType = 'success';
    modalEventConfig.nodeStatus = 'Completed Successfully';
    //////////////////////////////////////////////////

    $timeout(function() {
      scopeMutateResetValues();
      return modalInstance.close();
    }, TIME_CLOSE_MODAL);
    state.forceReload();
  }




  modalEventConfig.scopeMutateStart = scopeMutateStart;

  modalEventConfig.close = scopeMutateResetValues;

  return {
    runEventCheck: runEventCheck,
    modalEventConfig: modalEventConfig
  };

这是控制器:

angular.module('main.loadbalancer').controller('EditNodeCtrl', function($scope, $modalInstance, Configuration, LoadBalancerService, NodeService, StatusTrackerService, $state, $q) {
  NodeService.nodeId = $scope.id;
  $q.all([NodeService.getNode(), LoadBalancerService.getLoadBalancer()]).then(function(_arg) {
    var lb, node;
    node = _arg[0], lb = _arg[1];
    $scope.node = node;
    return $scope.save = function() {
      $scope.modalEventConfig.scopeMutateStart();
      return NodeService.updateNode({
        account_number: lb.customer,
        ip: node.address,
        port: node.port_number,
        label: node.label,
        admin_state: node.admin_state,
        comment: node.comment,
        health_strategy: {
          http_request: "" + node.healthMethod + " " + node.healthUri,
          http_response_accept: "200-299"
        },
        vendor_extensions: {}
      }).then(function(eventId) {
        return StatusTrackerService.runEventCheck(lb.customer, eventId,
          $modalInstance, $state);
      });
    }
  });

   $scope.modalEventConfig = StatusTrackerService.modalEventConfig;

我遇到的问题是在服务中。在newStatusEventscopeMutateSuccess(modalInstance, state);运行成功解决后,modalEventConfig.statusType = 'success';modalEventConfig.nodeStatus = 'Completed Successfully';更改未反映在视图中。

通常,这是因为需要digest()才能使angular.js意识到变化。但是,我已经在堆栈(chrome调试器)中验证了一个digest()在堆栈中先前被调用,并且当范围成员在函数scopeMutateSuccess(modalInstance, state);中变异时仍然有效

有什么奇怪的,如果我在modalEventConfig.nodeStatus = 'Completed Successfully';之后添加$ rootScope。$ apply()......那么Angular.js会抱怨digest()已经在进行中...... 但是。 ..视图将成功更新并反映范围成员nodeStatusstatusType中的新更改。但是,显然这不是答案/适当的解决方案。

所以,问题是为什么不是当前从堆栈开始运行的digest()(来自chrome调试器的堆栈)使angular.js知道modalEventConfig.statusType = 'success'和{{的范围更改1}?我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

$ scope.modalEventConfig = StatusTrackerService.modalEventConfig;是一个同步调用,你需要异步处理事物。 您还需要在呼叫区等待承诺(通过服务解决),即在控制器中等待。

答案 1 :(得分:0)

修正了它。

function scopeMutateSuccess(modalInstance,state){         /////////////////////////////////////////////////         //改变的SCPOPE数据成员但是         // CURRENT DIGEST()不包括更改         modalEventConfig.statusType =&#39;成功&#39 ;;         modalEventConfig.nodeStatus =&#39;已成功完成&#39 ;;         //////////////////////////////////////////////////

    $timeout(function() {
      scopeMutateResetValues();
      state.forceReload();
      return modalInstance.close(); 
    }, TIME_CLOSE_MODAL);

  }

我正在使用ui-router,我使用$ delegate进行刷新。我将state.forceReload();放在$ timeout中......范围成员应该更新。我完全不知道为什么,但我很高兴这种痛苦的经历已经结束。