2016-06-21 2 views
0

私たちはアプリケーションでangular-toastr.jsを使用しています。私たちは、次のディレクティブは、すべて私たちの編集フォームで使用している:のみを表示する

app.directive('serverError', ['resourceFactory','spinnerService', 'toastr', function (resourceFactory,spinnerService,toastr) { 
 
     return { 
 
      restrict: 'A', 
 
      controller: ['$scope', '$timeout', function ($scope, $timeout) { 
 

 
       var errorToastConfig = {closeButton:true,timeOut:0,tapToDismiss:true}; 
 

 
       $scope.$on('sm:badRequest', function (event, data) { 
 

 
        angular.forEach(data, function (value, key) { 
 
         if (value.message == '') value.message = 'The ' + value.property + ' value is invalid.' 
 
        }); 
 

 
        $scope.errors = data; 
 
        //$scope.alertMessage = resourceFactory.getResource('Messages', 'errorOnForm'); 
 
        //$scope.alertType = 'error'; 
 
        $timeout(function() { 
 
         spinnerService.stopSpinner(); 
 
        }, 0); 
 
        toastr.clear(); 
 
        var errorMsg = ($scope.errors[0] && $scope.errors[0].message?$scope.errors[0].message:resourceFactory.getResource('Messages', 'errorOnForm')); 
 

 
        toastr.error(errorMsg, errorToastConfig); 
 
        $scope.disableAction = false; 
 
       }); 
 

問題は、ページが不正な要求を検出したとき、私だけではなく、1つの画面上にメッセージtoastr 3を参照してくださいということですこのコードは角度で2回実行されるので、私のコントローラのコードから来て、このディレクティブから2が来ます。 toastr.clear()を追加しても問題は解決されません。理想的には、エラーがコントローラのコードによってすでに処理されている場合は、コードを実行したくありません。それ以外の場合は、エラー情報とともに1つのトーストしか表示しないようにしたい。あなたは上記で変更が必要なものを見ていますか?

更新。私は悪い要求を処理するために私たちの主なapp.jsコードを表示することもできます。私がコードをデバッグしているときに、呼び出しが実行されると、ディレクティブコードが2回発生し、toastrs配列が空であることがわかります。あなたがtruepreventDuplicatesプロパティを設定することにより、スタックの同一の乾杯を持つ防ぐことができます

app.factory('badRequestInterceptor', ['$rootScope', '$q', function ($rootScope, $q) { 
 
     return { 
 
      'responseError': function (rejection) { 
 
       if (rejection.status === 400) { 
 
        $rootScope.$broadcast("sm:badRequest", rejection.data); 
 
       } 
 
       return $q.reject(rejection); 
 
      } 
 
     }; 
 
    }]); 
 

 
    app.factory('noConnectionInterceptor', ['$rootScope', '$q', function ($rootScope, $q) { 
 
     return { 
 
      
 
      'responseError': function (rejection) { 
 
       console.dir(rejection); 
 
       if (rejection.status === -1) { 
 
        $rootScope.$broadcast("sm:noConnection"); 
 
       } 
 
       return $q.reject(rejection); 
 
      } 
 
     }; 
 
    }]);

答えて

1

これはアプリのコードです。

メッセージから:重複は、メッセージ の内容に基づいて、前のトーストと一致しています。

ちょうどあなたのerrorToastConfigにプロパティを追加します。

var errorToastConfig = {closeButton:true,timeOut:0,tapToDismiss:true, preventDuplicates:true}; 

は、より多くの情報のためdocsを参照してください。

+0

残念ながら、これはうまくいかなかったが、これはうまくいかなかった。理由は、トースターがさまざまなスコープで作成されていることが原因だと思っています。その理由は、toastr.clear()またはその余分なプロパティは効果がありません。 app.jsには、元のメッセージに追加したような不正なリクエストのインターセプタがあります。デバッグすると、ディレクティブのコードが2回発生し、トースター配列が空であることがわかります。 – Naomi

+0

これは役立つかもしれませんが、これらの他のプロパティ 'preventOpenDuplicates'または' maxOpened'を試してみましたか? –

+0

私は試してみますが、ディレクティブコードがなぜ2回発生するのかを理解する必要があると思います。それが主な問題です。私はいくつかの形でこの指令を持っているかもしれません - 調べる必要があります。 – Naomi

関連する問題