angular-flashを使い始めたばかりで、メッセージが表示されますが、どこでメッセージをクリアすればよいですか?
すべてのアクションで flash.message('') を設定するだけですか、それともルートのどこかに配置しますか? フェードアウトするようにタイマーでこれを行う方法はありますか? コードにタイムアウト機能があることがわかりましたが、どこで初期化すればよいですか?
angular-flashを使い始めたばかりで、メッセージが表示されますが、どこでメッセージをクリアすればよいですか?
すべてのアクションで flash.message('') を設定するだけですか、それともルートのどこかに配置しますか? フェードアウトするようにタイマーでこれを行う方法はありますか? コードにタイムアウト機能があることがわかりましたが、どこで初期化すればよいですか?
クリアするための答えを見つけました:
flash('notice', 'User details updated!')
$location.path "/users/#{$stateParams['id']}"
$timeout (-> flash()), 2000
ソースコードを調べて、何が起こっているのかを把握しようとしています。メッセージをクリアしたいときにこれを行うと、手早く修正できます。
flash([]);
すべてのフラッシュ メッセージは配列にあるため、任意の配列のように処理できると思います。
私が汚いと言っている理由は、clear() や empty() 関数のようなものを使って、これを行うためのより良い方法があると想定しているからです。
独自のサービスでラップできます。
'use strict';
angular.module('myApp')
.service('ff', ['$rootScope', 'flash', '$timeout', function ($rootScope, flash, $timeout) {
var log = function(level) {
function inner(msg, sticky) {
if (level == 'info') flash(msg);
else flash(level, msg);
var promise = $timeout(function() {
var idx = _.findIndex($rootScope.messages, ['text', msg]);
$rootScope.messages.splice(idx, 1);
}, 2000);
if (sticky) {
$timeout.cancel(promise);
}
}
return inner;
};
return {
info: log('info'),
error: log('error'),
warn: log('warning'),
success: log('success')
};
}]);
そしてコントローラーで:
ff.info("This will go away.");
ff.error("This will stick", true);
flash
配列に追加するだけでなく、複数の呼び出しを行うのは残念です。つまり、この行を次のように置き換えます。
if (typeof $scope.messages !== 'undefined') {
$scope.messages = $scope.messages.concat(messages);
} else {
$scope.messages = messages;
}