【发布时间】:2014-08-01 08:33:50
【问题描述】:
当状态更改事件发生时,即使我在事件侦听器中看到变量已更新,我也有一个变量未更新为 $scope 函数的问题。
代码如下:
angular.module('testapp')
.controller('AnotherCtrl',
['$scope', '$rootScope', '$state',
function ($scope, $rootScope, $state) {
'use strict';
console.log("Init prevState.");
var prevState = 'null_state';
$scope.state = prevState;
$rootScope.$on('$stateChangeError',
function (event, toState, toParams, fromState, fromParams, error) {
console.log("Error");
if (toState.name === 'anotherState') {
console.log("Old State:" + prevState);
prevState = fromState.name;
console.log("New State:" + prevState);
}
})
$rootScope.$on('$stateChangeSuccess',
function (event, toState, toParams, fromState, fromParams) {
console.log("Success");
if (toState.name === 'anotherState') {
console.log("Old State:" + prevState);
prevState = fromState.name;
console.log("New State:" + prevState);
}
})
$scope.goBack = function () {
//$scope.state = 'anotherState';
console.log("goBack:" + prevState);
$state.transitionTo(prevState, {arg: 'Robert'});
};
}]);
这是 HTML 模板:
<div>
<h1>Another view</h1>
<br>
<br>
State: <span ng-model="state">{{state}}</span>
<br>
<br>
<button ng-click="goBack()">Back</button>
</div>
这是控制台输出:
所以当我按下调用函数goBack() 的按钮时,prevState 变量仍然是'null_state'。
谁能解释一下问题出在哪里?
更新在查看答案后 我已经审查并测试了所有建议的解决方案。核心问题 AFAICS 与不可变的字符串类型无关。正如我所见,最好的答案来自@Khanh TO。最初创建控制器时未初始化事件侦听器。这是通过引导(angular.module.run)修复的。此外,每次加载状态/视图时都会重新初始化控制器,从而导致变量 prevState 被重新初始化,因此侦听器函数和 goBack() 函数使用不同的外部 prevState 变量。将 prevState 存储在 rootScope 上解决了这个问题。
【问题讨论】:
-
可以分享一下这个控制器相关的HTML吗?
标签: javascript angularjs