angularjs material-design toast angular-material

angularjs - ¿Cómo puedo cambiar el color de Toast depende del tipo de mensaje en material angular $ mdToast?



angular material toast (9)

Hay una manera más fácil al especificar un tema:

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

Y en tu CSS:

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

Puede incorporar su tipo de mensaje para seleccionar dinámicamente un tema.

Actualización : como señaló Charlie Ng, para evitar advertencias sobre el uso de un tema personalizado no registrado, regístrelo en su módulo utilizando el proveedor de temas: $mdThemingProvider.theme("success-toast")

Otra actualización : se produjo un cambio importante el 2 de diciembre de 2015 (v1.0.0 +). Ahora necesita especificar:

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

Mientras usa $mdToast.simple().content("some test") muestra la tostada con color negro. ¿Cómo puedo cambiar ese color a rojo, amarillo y así, depende del tipo de mensajes de error como error, advertencia y éxito.

Pregunta similar a this .


Primero preferí la solución, pero no me gusta configurar un tema en el proveedor de temas solo por un brindis. Entonces, ¿qué tal esta solución?

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'') )

y luego HTML (JADE)

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

Traté de usar la opción locals para pasar variables al controlador, pero por alguna razón no se inyectan. ( https://material.angularjs.org/latest/#/api/material.components.toast/service/ $ mdToast verifique la lista de opciones en la función show )

Luego dura el CSS (STYLUS)

md-toast.success background-color green md-toast.error background-color red

Resumen: hay una plantilla en este caso que puede proporcionar marcadores de posición personalizados que rellena previamente en su controlador. Esta solución me funciona.


Puede ver en este enlace que no puede cambiar el color de fondo del elemento, siempre se solucionará:

github.com/angular/material/blob/master/src/components/toast/…

Esto se debe a que las Pautas de diseño de materiales para tostadas establecen que el fondo siempre será el mismo:

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

Tenga en cuenta el elemento de background en la lista de especificaciones .

No se dice nada sobre el color del texto en cada situación, está implícito que sigue a la paleta de backgroundPalette , en la rotación de tono ''50'', declarada en ese CSS en el enlace de GitHub.

La forma de distinguir un brindis de warn , o uno con accent , del predeterminado, llamando a un action toast , cada uno con su botón de acción utilizando la clase apropiada ( md-warn o 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'' });

El brindis en sí, cuya forma default significa un informe de acción, con éxito implícito. Si necesita más atención, fuerce su cierre configurando un botón de acción para agregar acciones como ''Reintentar'', ''Informar un problema'', ''Detalles'', que se pueden usar para capturar este clic y registrar información técnica, etc. .. los ejemplos varían de lo que necesita.


Puedes hacerlo con factory y algunos 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) ); } } }());

Y 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; }


Solo para dar otra opción, $mdToast permite definir ajustes preestablecidos de tostadas que puede instanciar fácilmente de esta manera, aunque me cuesta entender cómo cambiar el contenido del texto, ¿alguna idea?

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

Los ajustes preestablecidos se definen como se explica en 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 }; } });


Un paso más para la respuesta de rlay3.

El material angular en 0.7.1 agregó advertencia a los temas no registrados. https://github.com/angular/material/blob/master/CHANGELOG.md#071--2015-01-30

Si el tema no está registrado, cada vez que aparezca el brindis, recibirá un mensaje de advertencia en la consola como, por ejemplo:

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

Para deshacerse de la advertencia, deberá configurar el tema ''brindis personalizado'' en su aplicación angular:

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

y úsalo como:

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

referencias: https://material.angularjs.org/latest/#/Theming/04_multiple_themes


Usted preguntó sobre el uso de la simple llamada tostada. ¿Te importaría probar un programa personalizado de tostadas como la demostración y agregar clases a la plantilla?

JS

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

MODELO

<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; }

CONTROLADOR (CAFÉ)

''use strict'' ###* # @ngdoc function # @name angularApp.controller:ToastCtrl # @description # # ToastCtrl # Controller of the angularApp ### angular.module(''angularApp'') .controller ''ToastCtrl'', ($scope) -> $scope.closeToast = ()-> $mdToast.hide()


registrar temas:

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

agregar 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; }

utilizar:

$mdToast.show( $mdToast.simple() .content(message) .hideDelay(2000) .position(''bottom right'') .theme(type + "-toast") );


EDITAR:
Para una implementación correcta, ¡use la solution rlay3 continuación :)!

ANTICUADO:
Tuve problemas para mostrar texto personalizado con la solución jhblacklocks, así que decidí hacerlo así usando ''plantilla'':

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

También agregué los diferentes tipos en mi archivo .css:

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

No sé si este es el enfoque más hermoso, pero no necesito una plantilla de archivos para cada tipo de diálogo y mostrar texto personalizado es realmente fácil.