私たちはアプリケーションで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配列が空であることがわかります。あなたがtrue
にpreventDuplicates
プロパティを設定することにより、スタックの同一の乾杯を持つ防ぐことができます
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);
}
};
}]);
残念ながら、これはうまくいかなかったが、これはうまくいかなかった。理由は、トースターがさまざまなスコープで作成されていることが原因だと思っています。その理由は、toastr.clear()またはその余分なプロパティは効果がありません。 app.jsには、元のメッセージに追加したような不正なリクエストのインターセプタがあります。デバッグすると、ディレクティブのコードが2回発生し、トースター配列が空であることがわかります。 – Naomi
これは役立つかもしれませんが、これらの他のプロパティ 'preventOpenDuplicates'または' maxOpened'を試してみましたか? –
私は試してみますが、ディレクティブコードがなぜ2回発生するのかを理解する必要があると思います。それが主な問題です。私はいくつかの形でこの指令を持っているかもしれません - 調べる必要があります。 – Naomi