Comment puis-je changer la couleur du Toast dépend du type de message dans le matériau angulaire $mdToast?

en utilisant $mdToast.simple().content("some test") il montre le toast avec la couleur Noire. Comment puis-je changer cette couleur en rouge, jaune et donc, dépend du type de messages d'erreur comme Erreur, Avertissement et succès.

question similaire à cette .

50
demandé sur Community 2015-02-12 18:12:45

9 réponses

EDIT:

Pour une mise en œuvre correcte, s'il vous plaît utiliser rlay3s solution ci-dessous :)!

périmé:

J'ai eu des problèmes pour afficher du texte personnalisé avec la solution jhblacklocks, donc j'ai décidé de le faire comme ceci en utilisant 'template':

var displayToast = function(type, msg) {

    $mdToast.show({
        template: '<md-toast class="md-toast ' + type +'">' + msg + '</md-toast>',
        hideDelay: 6000,
        position: 'bottom right'
    });
};

j'ai aussi ajouté les différents types dans my .fichier css:

.md-toast.error {
    background-color: red;
}

.md-toast.success {
    background-color: green;
}

Je ne sais pas si c'est la plus belle approche, mais je n'ai pas besoin de fichiers de modèle pour chaque type de dialogue et l'affichage de texte personnalisé est vraiment facile.

30
répondu error1337 2017-05-23 11:54:54

il est plus facile de spécifier un thème:

$mdToast.simple().content("some test").theme("success-toast")

et dans votre CSS:

md-toast.md-success-toast-theme {
    background-color: green;
    ...
}

vous pouvez incorporer votre type de message pour sélectionner dynamiquement un thème.

mise à Jour : Comme L'a souligné Charlie Ng, pour éviter les avertissements concernant l'utilisation d'un thème personnalisé non enregistré, enregistrez-le dans votre module en utilisant le fournisseur de thème: $mdThemingProvider.theme("success-toast")

Une autre mise à jour : Il y a eu un breaking change créé le 2 décembre 2015 (v1.0.0+). Vous devez maintenant spécifier:

md-toast.md-success-toast-theme {
    .md-toast-content {
        background-color: green;
        ...
    }
}
81
répondu rlay3 2016-02-27 00:41:10

enregistrer les thèmes:

$mdThemingProvider.theme("success-toast");
$mdThemingProvider.theme("error-toast");

ajouter css:

md-toast.md-error-toast-theme div.md-toast-content{
    color: white !important;
    background-color: red !important;
}

md-toast.md-success-toast-theme div.md-toast-content{
    color: white !important;
    background-color: green !important;
}

utiliser:

$mdToast.show(
    $mdToast.simple()
        .content(message)
        .hideDelay(2000)
        .position('bottom right')
        .theme(type + "-toast")
);
9
répondu mattatwork 2016-03-04 17:33:40

vous pouvez voir sur ce lien que vous ne pouvez pas changer la couleur de fond de l'élément, il sera toujours fixé:

https://github.com/angular/material/blob/master/src/components/toast/toast-theme.scss

c'est parce que les directives de conception des matériaux pour les Toasts indiquent que le fond restera toujours le même:

https://www.google.com/design/spec/components/snackbars-toasts.html#snackbars-toasts-specs

noter l'article background sur la liste Specs .

rien n'est dit sur la couleur du texte dans chaque situation, il est sous-entendu qu'il suit le backgroundPalette , sur la rotation '50', déclaré sur ce CSS sur le lien GitHub.

La façon de distinguer un warn toast, ou d'un accent - ted one, par défaut, appelant un action toast , chacun avec son bouton d'action utilisant la classe appropriée ( md-warn ou md-accent ).

$mdToast.show({
    template: '<md-toast>\
        {{ toast.content }}\
        <md-button ng-click="toast.resolve()" class="md-warn">\
            Ok\
        </md-button>\
    </md-toast>',
    controller: [function () {
        this.content = 'Toast Content';
    }],
    controllerAs: 'toast'
});

le toast lui-même, que sa forme default signifie un rapport d'action, avec succès implicite. Si elle a besoin de plus encore plus d'attention, forcer sa fermeture en mettant en place un bouton d'action ajouter des actions comme 'Rety', 'Report a problem',' Details', qui peuvent être utilisés pour attraper ce clic et enregistrer quelques informations techniques, etc... les exemples varient de ce dont vous avez besoin.

8
répondu Mateus Leon 2016-01-05 16:30:16

encore un pas vers la réponse de rlay3.

Angulaire de Matériel à la 0.7.1 ajouté avertissement pour non thèmes. https://github.com/angular/material/blob/master/CHANGELOG.md#071--2015-01-30

si le thème n'est pas enregistré, chaque fois que le toast apparaît, vous recevrez un message d'avertissement dans la console comme, par exemple:

attempted to use unregistered theme 'custom-toast'
angular.js:12416 Attempted to use unregistered theme 'custom-toast'. 
Register it with $mdThemingProvider.theme().

Pour se débarrasser de l'avertissement, vous aurez besoin pour configurer le thème 'custom-toast' dans votre application angulaire:

angular.module('myApp', ['ngMaterial'])
.config(function($mdThemingProvider) {
  $mdThemingProvider.theme('custom-toast')
});

et l'utiliser comme:

$mdToast.simple().content("some test").theme("custom-toast");

, les références: https://material.angularjs.org/latest/#/Theming/04_multiple_themes

7
répondu Charlie Ng 2015-09-02 18:14:37

vous avez demandé à propos de l'utilisation de l'appel toast simple. Pourriez-vous essayer un toast personnalisé show comme la démo et ajouter des classes au modèle?

JS

$mdToast.show(
  controller: 'ToastCtrl',
  templateUrl: 'views/shared/toast.html',
  hideDelay: 6000,
  position: $scope.getToastPosition()
)

modèle

<md-toast class="flash">
  <span flex>Custom toast!</span>
  <md-button ng-click="closeToast()">
   Close
  </md-button>
</md-toast>

CSS

md-toast.flash {
  background-color: red;
  color: white;
}

CONTROLLER (COFFEE)

'use strict'

###*
 # @ngdoc function
 # @name angularApp.controller:ToastCtrl
 # @description
 # # ToastCtrl
 # Controller of the angularApp
###
angular.module('angularApp')
  .controller 'ToastCtrl', ($scope) ->
    $scope.closeToast = ()->
      $mdToast.hide()
2
répondu jhblacklock 2015-02-26 21:19:56

juste pour donner une autre option, $mdToast permet de définir toast presets que vous pouvez facilement instancier de cette façon, bien que je me bats pour comprendre comment changer le contenu du texte, une idée?

$mdToast.show(
  $mdToast.error()
);

les presets sont définis comme expliqué sur https://material.angularjs.org/latest/api/service / $mdToast:

$mdToastProvider.addPreset('error', {
  options: function() {
    return {
      template:
        '<md-toast>' +
          '<div class="md-toast-content">' +
          '</div>' +
        '</md-toast>',
      position: 'top left',
      hideDelay: 2000,
      toastClass: 'toast-error',
      controllerAs: 'toast',
      bindToController: true
    };
  }
});
1
répondu Luca Faggianelli 2016-09-06 23:03:51

j'ai d'abord préféré la solution mais je n'aime pas mettre en place un thème dans le fournisseur de thème juste pour un toast. Alors que pensez-vous de cette solution:

JS (Café)

   if error
      message = ''

      if error.reason is 'Incorrect password'
        message = 'Email and password combination is incorrect'
      if error.reason is 'User not found'
        message = 'No account found with this email address'

      $mdToast.show(
        templateUrl:  'client/modules/toasts/toastError.html'
        hideDelay:    3000
        controller: ( $scope ) ->
          $scope.message    =  message
          $scope.class      = 'error'
          $scope.buttonLabel = 'close'
          $scope.closeToast = ->
            $mdToast.hide()
      ).then( ( result ) ->
        if result is 'ok'
          console.log('do action')
      )

puis HTML (JADE)

md-toast(ng-class="class")
  span(flex) {{message}}
  md-button.md-action(ng-click="closeToast()") {{buttonLabel}}

j'ai essayé d'utiliser l'option locals pour passer les variables au contrôleur, mais pour une raison quelconque, elles ne sont pas injectées.( https://material.angularjs.org/latest/#/api/material.components.toast/service/ $mdToast consulter la liste des options sous show fonction)

puis le dernier CSS (STYLUS)

md-toast.success
  background-color    green

md-toast.error
  background-color    red

résumé: il y a sur le modèle dans ce cas que vous pouvez donner des placeholders personnalisés que vous préférez dans votre controller. Cette solution fonctionne pour moi.

0
répondu Mattijs 2015-08-27 05:38:26

vous pouvez le faire avec l'usine et quelques css.

(function () {
  'use strict';

  angular
    .module('app.core')
    .factory('ToastService', ToastService);

  /** @ngInject */
  function ToastService($mdToast) {

    var service = {
      error: error,
      success: success,
      info : info
    };

    return service;

    //////////

    function success(text) {
      $mdToast.show(
        $mdToast.simple()
          .toastClass("toast-success")
          .textContent(text)
      );
    }

    function info(text) {
      $mdToast.show(
        $mdToast.simple()
          .toastClass("toast-info")
          .textContent(text)
      );
    }

    function error(text) {
      $mdToast.show(
        $mdToast.simple()
          .toastClass("toast-error")
          .textContent(text)
      );
    }
  }
}());

et css.

.toast-error .md-toast-content{
  background-color: rgb(102,187,106) !important;
}

.toast-info .md-toast-content{
  background-color: rgb(41,182,246) !important;
}

.toast-error .md-toast-content{
  background-color: rgb(239,83,80) !important;
}
0
répondu hurricane 2017-08-02 12:15:24