我有以下控制器,它在页面加载时执行并更改提交按钮的值和状态。完整的例子可以在这里看到,并且基于这个问题。
app.controller('FormSubmitCtrl', function($scope, $rootScope, $timeout) {
$scope.loading = false;
$scope.load = function($event) {
$rootScope.event_target = $event.target;
$scope.loading = true;
$timeout(function() { $scope.loading = false; }, 5000);
}
});
app.directive('disabler', function($compile, $rootScope) {
return {
link: function(scope, elm, attrs) {
//var btnContents = $compile(elm.contents())(scope);
scope.$watch(attrs.ngModel, function(value) {
if (value) {
scope.initial_value = elm.attr('value');
if (elm.attr('name') == $rootScope.event_target.name){
elm.attr('value', scope.$eval(attrs.disabler));
setTimeout(function(){
elm.attr('disabled',true);
}, 0);
}
} else {
//elm.html('').append(btnContents);
if (typeof $rootScope.event_target != "undefined"){
//server did not respond in timeline fashion .. inform user
if (elm.attr('name') == $rootScope.event_target.name){
elm.attr('value', scope.initial_value);
elm.attr('disabled',false);
}
}
}
});
}
}
});
表单.html
<input id="submit_item_button" name="form2_submit_btn1" type="submit" value="Go" class="btn" disabler="'Loading..'" ng-model="loading" ng-click="load($event)"/>
如果用户在页面上成功提交表单,用户将被服务器重定向到另一个页面。如果用户现在立即使用历史返回按钮重新进入页面,则不再进入控制器。这是一个问题,因为上面的控制器将范围变量 loading 更改为 true,如果用户返回,他仍然会看到显示值“正在加载”的按钮。
如果控制器将在历史记录中输入,则加载变量将设置为 false,并且按钮将显示初始值和正确值。
偶然我发现当我包含(仅包含,没有方法调用它..!)jquery地址插件(粘贴bin代码)时,控制器在历史记录中输入,加载变量设置为false并且提交按钮显示正确的值,而不是加载..值。因此,地址插件似乎触发了一些事件,进而触发了角度控制器。因为我不再需要地址插件,所以我想摆脱它,特别是我想了解发生了什么。
我现在的问题是:如果用户通过使用浏览器中的历史后退按钮进入页面,我如何告诉 Angular 重新进入控制器!?
更新:我仅在 OSX 上的 Safari 中遇到此问题。使用 Chrome,控制器也会在历史记录中输入,这是预期的行为。请参阅 Thom Porter 的示例设置:http: //so.thomporter.com/force-angular-to-re-enter-controller-on-history-back/