Introducción
Vamos a crear una aplicación de correo electrónico usando Angular JS. Primero, vamos a construir el front-end usando AngularJS y HTML, al final vamos a agregar la porción del servidor.
Vamos a aprender angular sumergiéndonos y explicando conceptos a medida que avanzamos como tenemos que hacerlo. Como no haremos la porción del servidor hasta el final, tendremos que burlarnos de esos datos directamente en el código. Creo que esta no es solo una buena manera de aprender, es una buena manera de construir una aplicación.
- ¿Qué motor de plantillas web utiliza la extensión .m?
- ¿Puedo quitar la sombra de la imagen de una sola imagen?
- ¿Cuáles son las ventajas de construir una aplicación web usando Ruby on Rails vs. PHP / MySQL?
- ¿Dónde puedo encontrar especificaciones técnicas (probablemente en algún lugar de MSDN) relacionadas exactamente con qué etiquetas HTML y CSS son compatibles con los correos electrónicos HTML de Outlook Web Mail?
- ¿Cuál es la diferencia entre el desarrollo front-end y back-end?
Para empezar, necesitamos nuestro HTML repetitivo. Este HTML incluirá todas las bibliotecas necesarias. Vamos a usar Bootstrap para nuestra apariencia y, por supuesto, Angular para nuestras entrañas.
Así es como se ve ese código:
Ocultar código de copia
Para empezar, nos centraremos en la funcionalidad relacionada con la administración de correos electrónicos, esto significa que no vamos a abordar cosas como el inicio de sesión del usuario, al menos no en este momento.
Lo primero que vamos a abordar es la lista de correo electrónico. Desde esta pantalla, deberíamos poder ver de quién es el correo electrónico, cuál es el asunto del correo electrónico y cuándo lo recibimos.
Primero, vamos a escribir el HTML para esta tabla, luego vamos a usar angular para generarlo dinámicamente. Aquí está el HTML para la versión estática:
Ocultar código de copia
Guinan | Es una bebida de la Tierra. Jugo de ciruela. | 24 de diciembre |
Beverly Crusher | El capitán siempre se esfuerza demasiado. | 23 de diciembre |
Mamá | No olvides usar ropa interior limpia hoy. | 22 de noviembre |
Las clases en la table
son clases de arranque que hacen que la mesa se vea bien. Esto es lo que parece esto:
Vamos a tomar un enfoque paso a paso muy gradual para construir esta tabla usando angular para introducir varios conceptos en detalle. Primero, intentaremos usar una expresión angular para reemplazar una de las piezas de datos. Reemplace Guinan
con {{ "Guinan Test" }}
. Esto debería hacer que se muestre Guinan Test
en lugar de Guinan
.
Pero eso no es lo que pasa. En cambio, esto sucede:
Esto se debe a que AngularJS no se aplica automáticamente. Tienes que decirle a Angular en qué partes de la página se aplicará. Para ello, agregue el atributo ng-app, puede agregar ese atributo en cualquier nivel, agreguemoslo a la etiqueta del contenedor
y veamos qué sucede.
Su etiqueta HTML debería verse así:
Ocultar código de copia
Cuando actualice, debería ver el valor dentro de los corchetes:
Las expresiones le permiten incrustar JavaScript directamente en su HTML. (Técnicamente no es JavaScript, pero ese es un tema para otro momento). En el mundo real, no tendría sentido usar una expresión solo para mostrar una string
, lo estoy haciendo aquí para introducir el concepto.
Básicamente, angular ejecuta el código dentro de las llaves dobles y muestra el resultado. Si, por ejemplo, reemplazó esa expresión con:
Ocultar código de copia
{{“Guinan” + “” + “Smith”}}
Si reemplazó la expresión con:
Ocultar código de copia
{{10 * 3}}
Obtendrías:
Una vez más, estos no son ejemplos del mundo real, no tendría sentido usar un expreso que se multiplique 10 veces 3 ya que ya sabemos la respuesta. La verdadera diversión es cuando comenzamos a usar expresiones con datos.
Entonces, sigamos haciendo que esta tabla sea impulsada por datos. Ahora ya usamos el atributo ng-app
para que angular sepa qué parte del HTML procesar. Angular llama a estas directivas. Ahora vamos a usar el atributo ng-init
para inicializar algunos datos, luego actualizar una de las filas para usar esos datos.
Podemos usar este atributo en cualquier lugar. Voy a ponerlo en la etiqueta
. Entonces mi etiqueta
ve así:
Ocultar código de copia
Ahora voy a actualizar la primera fila de mi tabla para usar esos datos. De esto:
Ocultar código de copia
{{10 * 3}}
Es una bebida de la Tierra. Jugo de ciruela.
24 de diciembre
A esto:
Ocultar código de copia
{{email.from}}
{{email.subject}}
{{email.date}}
Y cuando lo ejecuto, obtengo esto:
Ahora, en lugar de un correo electrónico, hagamos una serie de correos electrónicos, luego visualicemos una fila para cada correo electrónico. Para hacer eso, tendremos que cambiar nuestro ” ng-init
” para que cree una matriz, luego usar otra directiva angular para repetir la fila HTML para cada correo electrónico. Para hacer eso, usamos otra directiva llamada ” ng-repeat
“.
Entonces cambie el ng-init
a:
Ocultar código de copia
<tbody ng-init = "
correos electrónicos = [
{de: ‘John’, asunto: ‘Me encanta angular’, fecha: ‘1 de enero’},
{de: ‘Jack’, asunto: ‘Angular y yo solo somos amigos’, fecha: ’15 de febrero’},
{de: ‘Ember’, asunto: ‘¡Te odio Angular!’, fecha: ‘8 de diciembre’}
]
“>
Luego agregue el siguiente atributo y valor ng-repeat
a la etiqueta
:
Ocultar código de copia
ng-repeat = “correo electrónico en correos electrónicos”
Para que se vea así:
Ocultar código de copia
Cuando lo ejecutes, deberías obtener esto:
Ahora tenemos una tabla generada dinámicamente. El problema es que todos los datos están en el HTML, de qué sirve eso, arreglemos eso.
Vamos a obtener el código que inicializa la matriz de correos electrónicos fuera del HTML a donde pertenece en el JavaScript. Para hacer esto, tendremos que crear una función especial que Angular llama un controlador. Luego, usaremos la directiva ng-controller
para asociar ese controlador con una parte del HTML, similar a lo que hicimos con ng-app
.
Entonces agregue el siguiente código a su JavaScript:
Ocultar código de copia
función EmailController ($ scope) {
$ scope.emails = [
{de: ‘John’, asunto: ‘Me encanta angular’, fecha: ‘1 de enero’},
{de: ‘Jack’, asunto: ‘Angular y yo solo somos amigos’, fecha: ’15 de febrero’},
{de: ‘Ember’, asunto: ‘¡Te odio Angular!’, fecha: ‘8 de diciembre’}
];
}
Luego, en su HTML, agregue la directiva ng-controller
y asígnele el valor EmailController
. Puede usar esta directiva en cualquier elemento, pero solo ese elemento y sus elementos secundarios pueden acceder a la variable de correos electrónicos creada en el controlador, por lo que debe asignarse a un padre de la etiqueta
. Voy a agregarlo a la etiqueta de la table
para que se vea así:
Ocultar código de copia
Si lo ejecuta, todo debería verse exactamente igual. Lo único que cambió es que en lugar de que los correos electrónicos se inicialicen dentro del HTML, ahora se inicializan dentro de la función del controlador.
¿Notó que la función del controlador tiene un parámetro llamado $scope
? Así es como se comparten los datos entre un controlador y HTML. El controlador puede acceder a todas las variables creadas en el $scope
por el controlador, y viceversa.
Ahora agregaremos la posibilidad de hacer clic en un correo electrónico y ver su contenido. Vamos a utilizar el HTML de diálogo modal estándar de Bootstrap para crear la ventana emergente de correo electrónico. Para hacerlo, agregue el siguiente HTML debajo de su tabla:
Ocultar código de copia
Asunto
Fecha: 2 de enero
Hola,
¿Cómo te va?
Sinceramente
Tu hermano
Cuando ejecute esto, debería ver una ventana emergente superpuesta a su tabla que se ve así:
Ahora solo queremos que esta ventana emergente aparezca cuando el usuario hace clic en un correo electrónico de la lista. Primero, necesitamos una forma de controlar su visibilidad. Lo hacemos al vincularlo a una variable, cuando la variable es true
la ventana emergente es visible, cuando es false
, no lo es.
Primero isPopupVisible
la variable en el controlador, llamémosla isPopupVisible
y configurémosla como false
. Al igual que:
Ocultar código de copia
$ scope.isPopupVisible = false;
Su controlador debería verse así:
Ocultar código de copia
función EmailController ($ scope) {
$ scope.isPopupVisible = false;
$ scope.emails = [
{de: ‘John’, asunto: ‘Me encanta angular’, fecha: ‘1 de enero’},
{de: ‘Jack’, asunto: ‘Angular y yo solo somos amigos’, fecha: ’15 de febrero’},
{de: ‘Ember’, asunto: ‘¡Te odio Angular!’, fecha: ‘8 de diciembre’}
];
}
Ahora agregamos la directiva ng-show
a la ventana emergente para vincularla a esa variable. Para hacer eso, agregue la siguiente directiva a su div
modal:
Ocultar código de copia
ng-show = “isPopupVisible”
Debe tener un aspecto como este:
Ocultar código de copia
Ahora que hemos vinculado la visibilidad de la ventana emergente a la variable isPopupVisible
, necesitamos una forma de establecer esa variable en true
. Así que conectemos ese evento de click
a la lista de correo electrónico. Primero, crearemos una función que establezca esa variable en true
, llamémosla showPopup()
, así:
Ocultar código de copia
$ scope.showPopup = function () {
$ scope.isPopupVisible = true;
};
Su controlador ahora debería verse así:
Ocultar código de copia
función EmailController ($ scope) {
$ scope.isPopupVisible = false;
$ scope.showPopup = function () {
$ scope.isPopupVisible = true;
};
$ scope.emails = [
{de: ‘John’, asunto: ‘Me encanta angular’, fecha: ‘1 de enero’},
{de: ‘Jack’, asunto: ‘Angular y yo solo somos amigos’, fecha: ’15 de febrero’},
{de: ‘Ember’, asunto: ‘¡Te odio Angular!’, fecha: ‘8 de diciembre’}
];
}
Como cada correo electrónico corresponde a una fila, lo haremos a nivel de fila. Usaremos la directiva ng-click
Angular para llamar a esta función desde cada fila, así:
Ocultar código de copia
ng-click = “showPopup ()”
Para que su etiqueta
Ocultar código de copia
Ahora, antes de que esto funcione, tendremos que hacer una cosa más. Si recuerda desde arriba, ng-controller
aplica un controlador al elemento sobre el que está activado y a los elementos secundarios. La última vez que lo colocamos en la
debería verse así:
Ocultar código de copia
Ahora tiene una ventana emergente que aparece cuando hace clic en un correo electrónico. Probablemente notará de inmediato que no hay forma de cerrarlo. closePopup()
otra función llamada closePopup()
que establece isPopupVisible
en false
. Luego agreguemos una directiva ng-click
al botón de cierre, la ×
, y ng-click
que el botón de cierre llame a esa función.
Genial, ahora tenemos una ventana emergente que se abre y se cierra. Ahora hagamos que muestre el contenido del correo electrónico. Para lograr eso, vamos a tener que modificar showPopup()
para incluir un parámetro para que podamos especificar el correo electrónico que queremos mostrar. Luego, debemos almacenar ese correo electrónico en una variable y vincularlo a la ventana emergente. Finalmente, necesitamos pasar el correo electrónico a la función cuando el usuario hace clic en la lista.
Así que modifique la función para que se vea así:
Ocultar código de copia
$ scope.showPopup = function (correo electrónico) {
$ scope.isPopupVisible = true;
$ scope.selectedEmail = correo electrónico;
};
Luego, modifique el marcado de su modal para utilizar los datos del selectedEmail
electrónico selectedEmail
. Debería cambiar a partir de esto:
Ocultar código de copia
Asunto
Fecha: 2 de enero
Hola,
¿Cómo te va?
Sinceramente
Tu hermano
A esto:
Ocultar código de copia
{{selectedEmail.subject}}
Fecha: {{selectedEmail.date}}
Hola,
¿Cómo te va?
Sinceramente
Tu hermano
Finalmente, cambie la llamada a showPopup()
en la tabla para pasar el correo electrónico. Al igual que:
Ocultar código de copia
ng-click = “showPopup (correo electrónico)”
Su etiqueta
Ocultar código de copia
Tenga en cuenta que el email
es el nombre que le asignamos en ng-repeat
. Ahora, cuando hace clic en él, la ventana emergente mostrará el contenido del correo electrónico en el que hizo clic.
Lo único que no mostramos es el cuerpo del correo electrónico. Hagámoslo ahora. Modifiquemos la matriz de correos electrónicos para incluir un cuerpo de correo electrónico.
Ocultar código de copia
$ scope.emails = [
{
de: ‘John’,
Asunto: ‘Me encanta angular’,
fecha: ‘1 de enero’,
cuerpo: ‘hola mundo!’
},
{
de: ‘Jack’,
Asunto: ‘Angular y yo solo somos amigos’,
fecha: ’15 de febrero’,
cuerpo: ‘solo bromeaba’
},
{
de: ‘Ember’,
Asunto: ‘¡Te odio Angular!’,
fecha: ‘8 de diciembre’,
cuerpo: ‘wassup dude’
}
];
Ahora actualice el marcado del modal para que muestre esa copia en el cuerpo del modal.
Ahora vamos a agregar funcionalidad para redactar un correo electrónico. Para nuestra ventana emergente de redacción de correo electrónico, necesitaremos 3 campos y 2 botones. Un campo para la dirección Para, otro para Asunto y otro para el cuerpo del correo electrónico. Un botón para enviar y otro para cancelar. Nuestro HTML se ve así:
Ocultar código de copia
Redactar correo electrónico
El resultado se ve así:
Como hemos hecho antes, queremos agregar una variable y algunas funciones para controlar la visibilidad. Como ya explicamos cómo hacer esto, no me sumergiré aquí. En resumen, debemos hacer lo siguiente:
- Agregue la variable
isComposePopupVisible
al controlador - Cree la función
showComposePopup()
que lo establece entrue
- Cree la función
closeComposePopup()
que lo establece enfalse
- Se agregó
ng-show="isComposePopupVisible"
al modal - Se agregó
ng-click="closeComposePopup()"
a los botones×
y “Cerrar” - Se agregó un botón de redacción en la lista de correo electrónico:
-
- Se agregó
ng-click="showComposePopup()"
al botón
Ahora queremos capturar la información que ingresa el usuario, por lo que vamos a vincular los cuadros de texto a los campos de un objeto. Similar a lo que hicimos con la ventana emergente de correo electrónico usando la variable de correo electrónico selectedEmail
.
La diferencia es que con la ventana emergente de correo electrónico utilizamos expresiones, las expresiones son para representar datos. En este caso, vamos a utilizar la directiva ng-model
porque es un enlace bidireccional. Con eso quiero decir que si el usuario escribe algo en el campo de entrada, queremos que la variable se actualice automáticamente. Del mismo modo, si el controlador cambia el valor de una de las variables, entonces queremos que las entradas se actualicen automáticamente para reflejar eso.
Para comenzar, agregue la variable composeEmail
al controlador como un objeto vacío, así:
Ocultar código de copia
$ scope.composeEmail = {};
Luego actualice el HTML para enlazar a los campos en este objeto, agregando ng-model="composeEmail.to"
y ng-model="composeEmail.body"
a sy
Ahora confirmemos que esto es realmente vinculante al mostrar un cuadro de alerta con esta información cuando el usuario hace clic en el botón “Enviar”. Así que creemos una función en nuestro controlador,
composeEmail
botón “Enviar” y composeEmail
que muestre los valores en la variable composeEmail
. Su función debería verse así:
Ocultar código de copia
$ scope.sendEmail = function () {
alerta ($ scope.composeEmail.to
+ “” + $ scope.composeEmail.subject
+ “” + $ scope.composeEmail.body);
};
Ahora vamos a enlazar el botón ”
Send
” así:
Ocultar código de copia
Ahora puede probarlo haciendo clic en el botón “Redactar”, ingresando información en los campos “Para” y “Cuerpo” en el formulario y haciendo clic en “Enviar”. Deberías ver lo que escribiste en la ventana emergente.
Ahora agreguemos un par de cosas más. Lo primero que queremos hacer es hacer desaparecer la ventana emergente. Para hacer eso, agregaremos
$scope.isComposePopupVisible = false;
para sendEmail()
. Además, notará que si vuelve a hacer clic en el botón “Redactar” en lugar de que esté vacío, tiene la información que ingresó la última vez. Vamos a corregir esto asignando un objeto vacío a composeEmail
en la función showComposePopup()
. Cuando haya terminado, sus funciones deberían verse así:
Ocultar código de copia
$ scope.sendEmail = function () {
$ scope.isComposePopupVisible = false;
alerta ($ scope.composeEmail.to
+ “” + $ scope.composeEmail.subject
+ “” + $ scope.composeEmail.body);
};
$ scope.showComposePopup = function () {
$ scope.composeEmail = {};
$ scope.isComposePopupVisible = true;
};
Así que ahora hagamos algo un poco más interesante que mostrar un cuadro de alerta. Normalmente, los correos electrónicos que envía van a su carpeta “Enviados”. En este momento, solo tenemos el equivalente de una bandeja de entrada. Primero agreguemos una carpeta “Enviados” y alternemos entre ella y la “Bandeja de entrada” usando pestañas.
Comencemos con el HTML. Agregue el siguiente HTML a la parte superior de su contenedor:
Ocultar código de copia
Debe tener un aspecto como este:
Como todo lo demás que hemos “angularizado”, necesitamos una variable para realizar un seguimiento de la pestaña en la que nos encontramos. Llamémosla
activeTab
y, de forma predeterminada, configurémosla en ” inbox
“.
Ocultar código de copia
$ scope.activeTab = “bandeja de entrada”;
Ahora cambiemos esta variable cuando el usuario haga clic en “Bandeja de entrada” o “Enviado”. Podemos hacer eso dentro de
ng-click
, así ng-click="activeTab='inbox'"
. Entonces su HTML se ve así:
Ocultar código de copia
Ahora solo vamos a mostrar la lista de correo electrónico actual cuando activeTab es ”
inbox
” usando la directiva ng-show
así:
Ocultar código de copia
ng-show = “activeTab == ‘bandeja de entrada'”
Hasta aquí todo bien. Ahora, cuando hace clic en la pestaña “Enviados”, la lista de correo electrónico desaparece y cuando hace clic en ”
Inbox
” vuelve a aparecer.
El problema es que no puedes saber qué pestaña está seleccionada. Bootstrap tiene una forma de hacer que una pestaña se vea seleccionada, requiere agregar la clase CSS activa al elemento
la pestaña seleccionada. Ver http://getbootstrap.com/2.3.2/ja….
Por lo tanto, necesitamos una forma de agregar esta clase, pero solo cuando la variable activeTab
se establece en el valor correspondiente. Por lo tanto, el
para ” Inbox
” debe tener una clase activa solo cuando activeTab
esté configurado en ” inbox
“. Para esto, usamos la directiva ng-class
. Esta directiva toma un objeto, para cada propiedad de ese objeto, si el valor es true
, agrega una clase con ese nombre.
Por ejemplo, en el siguiente código, angular agrega la clase CSS activa al elemento
:
Ocultar código de copia
Bandeja de entrada
El resultado es:
Ocultar código de copia
Bandeja de entrada
Si el valor fuera
false
, la clase en este caso estaría vacía. En nuestro caso, queremos reemplazar true
con la condición apropiada de la siguiente manera:
Ocultar código de copia
Bandeja de entrada
Su código final debería verse así:
Ocultar código de copia
Y debería verse así:
Ahora lo único que queda es mostrar los correos electrónicos enviados en la pestaña “Enviados”. Para hacer eso, esencialmente necesitamos copiar lo que hicimos para la bandeja de entrada:
- Cree una variable en el controlador llamada
sentEmails
asígnele una matriz vacía - Copie la tabla HTML para la lista de correo electrónico.
- Cambie
ng-repeat
ang-repeat="email in sentEmails"
- Cambie la condición
ng-show
ang-show="activeTab=='sent'"
- Cambie
{{ email.from }}
a{{ email.to }}
Puede hacer una prueba rápida agregando objetos a la matriz
sentEmails
y confirmar que se muestran.
Ahora lo que queremos hacer ahora es agregar el correo electrónico enviado a esta matriz. Esta parte es puramente JavaScript, solo usamos la función
Array.push()
JavaScript para agregar composeEmail
a la matriz sentEmails
. Al igual que:
Ocultar código de copia
$ scope.sentEmails.push ($ scope.composeEmail);
Además, podemos aprovechar esta oportunidad para eliminar la alerta, ya que ahora podemos ver los correos electrónicos enviados en la pestaña “Enviados”.
YoursendEmail()
función YoursendEmail()
debería verse así:
Ocultar código de copia
$ scope.sendEmail = function () {
$ scope.isComposePopupVisible = false;
$ scope.sentEmails.push ($ scope.composeEmail);
};
Hasta aquí todo bien. Hay solo un par de cosas que podemos retocar. Por ejemplo, después de enviar un correo electrónico e ir a la pestaña “Enviados”, verá que la columna de fecha está en blanco. Esto se debe a que el campo de fecha no está vinculado a nada en el formulario, por lo que no se rellena. Esto es como debería ser porque la fecha debe ser la fecha en que envió el correo electrónico, no algo que el usuario especifique. Normalmente, esto se haría en el servidor, para nuestros propósitos, ya que aún no tenemos una porción del servidor, lo haremos en la función
sendEmail()
. Simplemente puede asignar la propiedad de date
directamente así:
Ocultar código de copia
$ scope.composeEmail.date = nueva Fecha ();
Ahora, si prueba esto enviando un correo electrónico, notará otro problema de inmediato. La fecha se parece a esto ”
2013-12-27T21:47:01.678Z
“. No me gusta eso, quiero que se vea como las fechas en la bandeja de entrada, pero esas fechas eran string
, no objetos de date
reales de JavaScript.
Afortunadamente, angular nos proporciona una forma de formatear nuestras expresiones usando algo llamado “filtros”. En nuestro caso, podemos corregir cómo se muestra la fecha cambiando este
{{ email.date }}
por este {{ email.date | date:'MMM d' }}
{{ email.date | date:'MMM d' }}
. Si te das cuenta, lo que hicimos fue agregar | fecha: ‘MMM d’ al final de la expresión existente.
La línea vertical, conocida como una tubería (|), es cómo le dice a angular que ejecute los datos a través de un filtro. El nombre del filtro en este caso es fecha, los dos puntos (:) separan el filtro del parámetro y la cadena que sigue le dice al filtro de fecha cómo formatearlo. Para conocer las diferentes formas en que puede formatear la fecha, consulte la documentación angular: http://docs.angularjs.org/api/ng… http://jsfiddle.net/luisperezphd….
Muy bien, solo algunas cosas más para limpiar. Por ejemplo, si envía un correo electrónico y luego hace clic en él para ver su contenido, la fecha en la ventana emergente sigue siendo fea: se perdió un lugar. El campo “De” está en blanco porque, como en el caso de la fecha, es algo que tenemos que asignar cuando se envía. Finalmente, no hay un campo “Para”. Las soluciones a estos son las mismas que los problemas que tratamos antes, así que conocemos la solución:
- Formatee la fecha usando el filtro agregando | fecha: ‘MMM d’ al final de la expresión
- Asignado
$scope.composeEmail.from
el valor ”me
” en la funciónsendEmail()
- Agregue el campo ”
To
” y la expresión al HTML - Asigne valores ”
To
” a los correos electrónicos de muestra en el controlador
Ahora vamos a trabajar en algunas de las funcionalidades restantes para completar la aplicación, como reenviar y responder correos electrónicos. Vamos a implementarlo reutilizando la funcionalidad de redacción de correo electrónico. Lo revisaré rápidamente, ya que es bastante sencillo y no estamos introduciendo ningún concepto nuevo.
Primero, necesitamos agregar los botones ”
Reply
” y ” Forward
” a la ventana emergente de detalles del correo electrónico.
Ocultar código de copia
Debería verse así:
Luego, creamos las funciones de
reply
y forward
en el controlador:
Ocultar código de copia
$ scope.forward = function () {
};
$ scope.reply = function () {
};
Luego, vinculamos esas funciones a los botones.
Ocultar código de copia
Ahora tenemos que hacer lo siguiente:
- Ocultar la ventana emergente de detalles de vista
-
composeEmail
objetocomposeEmail
- La forma en que se llena depende de si es una respuesta o un reenvío
- Mostrar la ventana emergente de redacción de correo electrónico
Eso es. Aquí está la función
reply()
comentada:
Ocultar código de copia
$ scope.reply = function () {
// ocultar la ventana emergente de detalles de la vista
$ scope.isPopupVisible = false;
// crea un objeto de composeEmail vacío al que está vinculada la ventana emergente de redacción de correo electrónico
$ scope.composeEmail = {};
// copia los datos de selectedEmail en composeEmail
angular.copy ($ scope.selectedEmail, $ scope.composeEmail);
// edite el cuerpo para colocarle un prefijo con una línea y la información original del correo electrónico
$ scope.composeEmail.body =
“\ n ——————————- \ n”
+ “from:” + $ scope.composeEmail.from + “\ n”
+ “enviado:” + $ scope.composeEmail.date + “\ n”
+ “a:” + $ scope.composeEmail.to + “\ n”
+ “asunto:” + $ scope.composeEmail.subject + “\ n”
+ $ scope.composeEmail.body;
// prefija el asunto con “RE:”
$ scope.composeEmail.subject = “RE:” + $ scope.composeEmail.subject;
// el correo electrónico va a la persona que nos lo envió
// rellena el to con from
$ scope.composeEmail.to = $ scope.composeEmail.from;
// viene de nosotros
$ scope.composeEmail.from = “yo”;
// muestra la ventana emergente redactar correo electrónico
$ scope.isComposePopupVisible = true;
};
Cuando hace clic en “Responder”, la ventana de redacción debería verse así:
El
forward()
es prácticamente idéntico a esto, la única diferencia es que el sujeto tiene el prefijo “FW:” en lugar de “RE:” y está en blanco en lugar del remitente.
Si ejecuta esto ahora, notará 2 cosas. Uno, en la pestaña “Enviados”, los correos electrónicos se enumeran de arriba hacia abajo en el orden en que fueron enviados. Queremos mostrar esto en el orden inverso para que el último correo electrónico que envió aparezca en la parte superior. Para hacer eso, podemos cambiar la línea de código que agrega
composeEmail
a la matriz sentEmails
. En lugar de usar push()
para agregar el correo electrónico al final de la matriz, usaremos splice()
para agregarlo al principio. Al igual que:
Ocultar código de copia
//$scope.sentEmails.push($scope.composeEmail); // ANTIGUO
$ scope.sentEmails.splice (0,0, $ scope.composeEmail); // NUEVO
Además, si abre uno de los correos electrónicos enviados con todo el texto agregado nuevo, verá que todo el texto se encuentra entre sí, sin saltos de línea. Podemos arreglar esto con un poco de CSS. Usaremos CSS en línea solo por esta vez. Envolveremos el cuerpo del correo electrónico alrededor de una etiqueta
y configuraremos la propiedad de espacio en blanco CSS como
pre
. Esto le dice al navegador que respete los saltos de línea. Al igual que:
Ocultar código de copia
{{selectedEmail.body}}
En términos de interfaz de usuario, nuestra aplicación ahora está bastante completa. Pero antes de que pueda ser una aplicación real, tiene que poder hablar con un servidor para hacer el trabajo real de enviar y almacenar correos electrónicos. Eso es lo que haremos en esta publicación.
Ahora lo primero que tengo que hacer es configurar la porción del servidor. A propósito, dejé esta publicación para el final porque quería que pudieras probar el código Angular sin obligarte a configurar un entorno de desarrollo local. Además, quería que fuera útil para todos, sin importar la tecnología de servidor que usaran: PHP, .NET, Node.js, etc.
Obviamente, no podré superar este punto. Después de todo, no puedo mostrarle cómo comunicarse con un servidor sin un servidor, y eso significa que tengo que elegir una tecnología. Voy a usar el sitio oficial de Microsoft ASP.NET MVC. También haré todo lo posible para describir la porción del servidor con suficiente detalle para que también sea útil para usted, independientemente de la tecnología de servidor que utilice.
El sitio oficial de Microsoft ASP.NET MVC Primer
Un manual muy rápido para aquellos que no están familiarizados con el sitio oficial de Microsoft ASP.NET MVC. En este tipo de aplicación web, las URL se asignan a clases y métodos. Por ejemplo, si un usuario ingresó la URL http: // localhost / Home / Index en su navegador web que
HomeController
el método Index()
en la clase HomeController
para ejecutarse.
Ese método puede elegir si devolver datos o HTML. El HTML se almacena en un archivo separado denominado vista. Estas vistas tienen la extensión .cshtml . Similar al controlador, la vista adecuada se selecciona en función de la URL, una vez más para la URL http: // localhost / Home / View, utilizará la vista almacenada en la carpeta \ Views \ Home \ Index.cshtml.
Por supuesto que estoy simplificando las cosas, pero esta explicación debería adaptarse a nuestros propósitos.
Regresar a la aplicación
Para comenzar, necesitamos crear un proyecto MVC del sitio oficial de Microsoft ASP.NET en Visual Studio. Elegí comenzar con un proyecto vacío y agregué una clase de controlador llamada
HomeController
. Y un método de acción llamado Index
. En mi opinión, incluyo el CSS, JavaScript y HTML que mencioné al principio.
Ahora vamos a actualizar la aplicación para que obtengamos la lista de correo electrónico del servidor en lugar de codificarla en JavaScript. Primero, crearemos el método en el controlador del sitio oficial de Microsoft ASP.NET:
Ocultar encogimiento
Código de copia
Public ActionResult GetEmails ()
{
devolver Json (nuevo [] {
nuevo {
from = “Riker”,
a = “yo”,
subject = “Encantado de conocerte, Pinocho”,
fecha = “8 de enero”,
body = “Eso y ayudar a Data a terminar ‘Pop Goes the Weasel’. También cuenta como un CMOH”.
},
nuevo {
de = “Picard”,
a = “yo”,
subject = “Lo siento, esto se está convirtiendo en un discurso”,
fecha = “7 de enero”,
body = “Pero entonces tengo derecho, soy el capitán”.
},
nuevo {
from = “Datos”,
a = “yo”,
subject = “¿Podría continuar …”,
fecha = “6 de enero”,
body = “… las pequeñas disputas? Lo encuentro más intrigante”.
},
nuevo {
de = “Troi”,
a = “yo”,
subject = “Pero deletreas cuchillo con una ‘k'”,
fecha = “5 de enero”,
body = “Deletreo ‘cuchillo’ con una ‘n’, pero nunca pude deletrear”.
},
});
}
En este ejemplo, devolvemos una lista estática de correos electrónicos. Estamos utilizando el método
Json()
para decirle al sitio oficial de Microsoft ASP.NET que devuelva estos datos al navegador como JSON.
Ahora, vamos a reemplazar la lista codificada en nuestro JavaScript con una llamada a esta acción. El JavaScript está en la vista junto con nuestro HTML ( /Views/Home/Index.cshtml ). Entonces reemplace esto:
Ocultar código de copia
$ scope.emails = [
{
de: ‘John’,
a mi’,
Asunto: ‘Amo angular’,
fecha: ‘1 de enero’,
cuerpo: ‘hola mundo!’
},
{
de: ‘Jack’,
a mi’,
Asunto: ‘Angular y yo solo somos amigos’,
fecha: ’15 de febrero’,
cuerpo: ‘solo bromeaba’
},
{
de: ‘Ember’,
a mi’,
Asunto: ‘¡Te odio Angular!’,
fecha: ‘8 de diciembre’,
cuerpo: ‘wassup dude’
}
];
Con este:
Ocultar código de copia
$ http.post (“/ Home / GetEmails”). luego (función (respuesta) {
$ scope.emails = response.data;
});
Finalmente, necesitamos agregar
$http
como parámetro en nuestro controlador Angular, como lo hicimos con $scope
. Por lo tanto, su método de controlador debe cambiarse de esto:
Ocultar código de copia
EmailController ($ scope)
a esto:
Ocultar código de copia
EmailController ($ scope, $ http)
Eso es todo, si compila y ejecuta esto, debería ver que su lista de correo electrónico cambia.
Uno abajo y otro para ir. El envío de correo electrónico será muy similar, la principal diferencia es que no pasamos ningún dato a
GetEmails()
pero necesitamos pasar información sobre el correo electrónico que enviamos a SendEmail()
.
Este método va a ser simple. Todo lo que el servidor va a hacer es rellenar la fecha y los campos del correo electrónico y enviar esa información a Angular. Para lograr esto, vamos a necesitar dos cosas. Necesitamos agregar una acción a nuestro controlador del sitio oficial de Microsoft ASP.NET y una clase C # para guardar los datos que Angular está enviando.
Comencemos con la clase C #. Debe contener todos los mismos campos encontrados en el código JavaScript. Para nuestros propósitos, puede poner esta clase en cualquier lugar. Para simplificar las cosas y mantener todo el código en un lugar, lo agrego como una clase anidada dentro del controlador:
Ocultar código de copia
clase pública ComposeEmail
{
cadena pública de {get; conjunto; }
cadena pública para {obtener; conjunto; }
asunto de cadena pública {get; conjunto; }
fecha de cadena pública {get; conjunto; }
cuerpo de cadena pública {get; conjunto; }
}
Ahora para el método de acción del sitio oficial de Microsoft ASP.NET:
Ocultar código de copia
Public ActionResult SendEmail (ComposeEmail composeEmail)
{
composeEmail.from = “yo”;
composeEmail.date = DateTime.Now.ToString (“MMM d”);
devolver Json (composeEmail);
}
Finalmente, la llamada de Angular. Cambie el método
sendEmail()
de esto:
Ocultar código de copia
$ scope.sendEmail = function () {
$ scope.isComposePopupVisible = false;
$ scope.composeEmail.from = “yo”;
$ scope.composeEmail.date = nueva Fecha ();
$ scope.sentEmails.splice (0, 0, $ scope.composeEmail);
};
A esto:
Ocultar código de copia
$ scope.sendEmail = function () {
$ http.post (“/ Home / SendEmail”, $ scope.composeEmail) .then (function (respuesta) {
$ scope.isComposePopupVisible = false;
$ scope.composeEmail = response.data;
$ scope.sentEmails.splice (0, 0, $ scope.composeEmail);
});
};
¡Eso es! Si ejecuta su código ahora, envíe un correo electrónico y verifique la pestaña “Enviados”, verá que la fecha está completa. Si hace clic para abrir ese correo electrónico, verá que también se rellena el campo ”
from
“.
Esto cubre lo esencial de AngularJS y todo lo que necesita para comenzar a crear una aplicación web funcional simple. En esta serie, creó una interfaz de usuario bastante elaborada con múltiples pantallas que se actualizan dinámicamente. Para hacerlo funcional, te comunicaste con un servidor back-end para hacer el trabajo.
Solo estamos rascando la superficie de lo que es posible con AngularJS.
Licencia
Este artículo, junto con cualquier código fuente y archivos asociados, está licenciado bajo The Code Project Open License (CPOL)
Related Content
Cómo recibir y almacenar datos JSON de una solicitud posterior usando Mongoose y Node.js
More Interesting
Cómo encontrar los enlaces rastreados en mi sitio web
¿Cuáles son las principales empresas de diseño de sitios web?
¿Qué propiedades CSS no se pueden aplicar a Span?
¿Qué es mejor, Markdown o Textil?
Cómo configurar un subdominio en Blogger
¿Cuáles son las perspectivas futuras de aprender Node.js en 2018?
¿Cuándo se cargan las imágenes de fondo CSS en el ciclo de vida de una página web?
¿Cuáles son los hechos que un desarrollador de pila completa debe saber?
¿Vale la pena el nano grado de desarrollador web front-end?
Cómo iniciar un proyecto de sistema de gestión de contenido y sus módulos