0

ユーザーがプロファイルで行った編集を保存するのを忘れた場合に備えて、ある種の「エラーチェッカー/検証」を考え出そうとしました。

  1. ユーザーは Profile.htmlを入力しstateます。彼らは自分の情報(名前、電話番号など) の一部を更新し始めます。SAVE CHANGES ボタンを押す代わりに、モバイル画面の左上にある SideMenu アイコンをクリックして、プロファイル状態から移動します。

  2. フォームは技術的には " $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);

$watch の Angular ドキュメント

考えてみると、これのためにファクトリーまたはサービスを作成する必要があるかもしれませんが、当時は、このコントローラーで$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');
          }
        });
      }
    };

それは基本的に私のコードの要点です。実際には「機能します」が、パターンを特定しました。これを達成するためのまったく異なる方法、またはこの現在のコードのリファクタリングのヒントを提案するために、あなたの支援が必要な場所です。

  1. ユーザーがサイドメニューボタンをクリックするとポップアップが表示されますが、フォームが $dirty であるかどうかは問題ではないと思います..

より大きな問題は、profile.html ビューまたはその他のビューを離れようとしているかどうかに関係なく、ポップアップが表示され始めることです。

このコードを書いたとき、オブジェクトを「監視」しているため、ポップアップとtoggleLeftSideMenu関数はプロファイル ビューでのみ機能するという印象を受けましたupdateDriverProfileInfo。また、メニュー コントローラーとプロファイル コントローラーの間で使用するグローバル変数も作成しました。

4

1 に答える 1

0

ionic Lifecycle についてよく理解している必要があります。以下のイベントのいずれかを試してください。

$scope.$on('$ionicView.leave', function(){
  // Anything you can think of
});

$scope.$on('$ionicView.beforeLeave', function(){
  // Anything you can think of
});

$scope.$on('$ionicView.unloaded', function(){
  // Anything you can think of
});

詳細はこちらhttp://www.gajotres.net/understanding-ionic-view-lifecycle/

于 2016-04-28T04:05:20.603 に答える