我的服务包括:
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;
我遇到的问题是在服务中。在newStatusEvent
和scopeMutateSuccess(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()
已经在进行中...... 但是。 ..视图将成功更新并反映范围成员nodeStatus
和statusType
中的新更改。但是,显然这不是答案/适当的解决方案。
所以,问题是为什么不是当前从堆栈开始运行的digest()(来自chrome调试器的堆栈)使angular.js知道modalEventConfig.statusType = 'success'
和{{的范围更改1}?我该怎么做才能解决这个问题?
答案 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中......范围成员应该更新。我完全不知道为什么,但我很高兴这种痛苦的经历已经结束。