如果我的用户忘记保存他们在个人资料上所做的编辑,我会尝试为我的用户提供某种“错误检查器/验证”。
用户输入 Profile.html
state
。他们开始更新他们的一些信息(即姓名、电话号码等)。他们没有按“保存更改”按钮,而是通过单击移动屏幕左上角的 SideMenu 图标离开配置文件状态。由于形式现在在技术上被认为是“
$dirty
”。我一开始尝试使用这个角度属性,但我无法真正得到我想要的结果,所以我用$watch
..试试运气
ProfileController.js
$rootScope.isFormDirty = false;//global variable 'isFormDirty'->inject in controller.js (toggleLeftSideMenu())
$scope.$watch('updateDriverProfileInfo', function(newValue, oldValue) {//new & oldValue = ng-model when form is 1st 'viewed' is dirty
//http://tutorials.jenkov.com/angularjs/watch-digest-apply.html
if (newValue !== oldValue) {
// console.log("updatingg")
$rootScope.isFormDirty = true;
}
}, true);
也许我现在应该为此创建一个工厂或服务,但当时我使用$rootScope
了这样我可以在这个控制器上设置一个全局变量isFormDirty
,并在这个 Ionic 中保存侧边菜单逻辑的通用控制器上使用它应用程序。
controller.js (这是 SideMenu 的控制器所在的位置)
$scope.sidemenuIsOpen = false;
$scope.toggleLeftSideMenu = function() {//ng-click from menu.html
$scope.sidemenuIsOpen = !$scope.sidemenuIsOpen;
if ($scope.sidemenuIsOpen && $rootScope.isFormDirty) {
var confirmPopup = $ionicPopup.confirm({
title: 'Changes were not saved',
template: 'Do you want to save your changes?',
});
confirmPopup.then(function(res) {
if (res) {
console.log('Run updateDriverProfile()');
} else {
console.log('Allow user to continue w/o changes');
}
});
}
};
这基本上是我的代码的要点。它实际上“有效”,但我已经确定了一种模式,这就是我需要你帮助的地方,要么建议一种完全不同的方法来完成这个,要么可能是一些针对当前代码的重构技巧。
- 当用户单击侧边菜单按钮时,弹出窗口确实会显示,但我认为表单是否为 $dirty 并不重要..
更大的问题是,无论您尝试离开 profile.html 视图还是任何其他视图,弹出窗口都会开始显示。
当我编写这段代码时,我的印象是弹出窗口和toggleLeftSideMenu
函数只能在配置文件视图上工作,因为我正在“监视”updateDriverProfileInfo
对象,并且我还创建了在菜单控制器和配置文件控制器之间使用的全局变量。