Este tutorial agregará la función de autocompletar a medida que escribe. En el formulario en el que un usuario puede ingresar una respuesta a un hilo, queremos que la aplicación comience automáticamente a buscar nombres de usuario para elegir cuando ingresa una cadena que comienza con el símbolo @. Hay un plugin de jQuery construido para este propósito exacto llamada At.js. Además del autocompletado de nombres de usuario, el complemento también ofrece caracteres emoji como emoticones, tazas de café y más. Dado que el formulario de respuesta es en realidad un componente de VueJS, eso significa que tendremos que importar el complemento jQuery al componente para que funcione. Juguemos con At.js ahora.
Instalación de At.js
Antes de que podamos usar el complemento, necesitaremos instalarlo. Instalamos at.js y jquery.caret usando el administrador de paquetes de hilo aquí.
vagrant @ homestead: ~ / Code / forumio $ yarn agregar at.js guardar vagrant @ homestead: ~ / Code / forumio $ yarn agregar jquery.caret guardar
Importar el complemento jQuery al componente Vue
En el componente que queremos hacer uso del complemento At.js, necesitaremos hacer uso de una declaración de importación. En el área de script del componente NewReply, así es como se importan esos dos módulos.
Bootup The Watcher
Como ahora estamos trabajando con Javascript, necesitaremos iniciar el observador.
vagrant @ homestead: ~ / Code / forumio $ yarn run watch-poll
Ahora que actualizamos los archivos en cuestión, el paquete web hace su trabajo en segundo plano, recompilando y minimizando sobre la marcha.
Aprovechamiento de At.js en el componente Vue
Ahora que el código está disponible para su uso dentro del propio componente Vue, podemos agregar algunas marcas para hacer uso de la funcionalidad de autocompletar. Hemos resaltado el marcado en cuestión aquí.
Examinemos cómo funciona esto. En primer lugar, ponemos esto dentro de la función VueJS montada (). Esto se activa después de que se haya montado la instancia de Vue, cuando el elemento de destino original se reemplaza con el elemento Vue.
A continuación, usamos jQuery para apuntar al elemento al que queremos agregar la funcionalidad de autocompletar. A través de jQuery ('# body'), apuntamos al elemento que tiene la identificación de 'body'. Tenga en cuenta que el <textarea> de este componente de Vue tiene una identificación de 'cuerpo', por lo que esto es con lo que funciona el complemento at.js.
Después de esto, se llama al método atwho (). Esta es la función principal utilizada en la biblioteca at.js. Se pasa un objeto a la llamada de atwho (). La propiedad 'at' es donde se especifica un carácter para que el complemento actúe. En nuestro caso, se utiliza el símbolo @. La propiedad 'delay' toma un valor en milisegundos.
El siguiente es la propiedad 'callbacks' y aquí hay funciones configuradas para manejar y representar los datos. Dentro de la propiedad de devoluciones de llamada se encuentra la llamada a remoteFilter que at.js usa para obtener datos coincidentes del servidor para completar la función de sugerencia automática. De hecho, si cargamos una página de hilos y comenzamos a escribir en el área de texto, si ingresamos un símbolo @, podemos ver que las solicitudes ajax se disparan al servidor.
Configurar la API de Laravel
El lado frontal de esto está más o menos en su lugar. Ahora necesitamos configurar un punto final en la API para que pueda responder a esas solicitudes de ajax. Lo que hará el punto final es buscar en la base de datos posibles coincidencias con el texto escrito y devolver esas posibles coincidencias a la interfaz. El front-end luego recorre los resultados y crea una lista de posibles coincidencias.
Agregar una ruta
Podemos agregar esta línea de código al final del archivo de rutas web.php.
Agregar una prueba
Agreguemos una prueba para este punto final de la API.
- Dado que tenemos un usuario LilKim
- Dado que tenemos un usuario LilJim
- Dado que tenemos un usuario JoeBlow
- Cuando se realiza una solicitud json
- Entonces deberíamos tener 2 posibles coincidencias
Ejecutar la prueba nos da una ReflectionException de "Class AppHttpControllersApiUsersController no existe"
vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_it_can_fetch_all_mentmented_users_starting_with_the_given_characters PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores. E 1/1 (100%) Tiempo: 808 ms, memoria: 8,00 MB Hubo 1 error: 1) TestsFeatureMentionUsersTest :: test_it_can_fetch_all_mentmented_users_starting_with_the_given_characters ReflectionException: la clase AppHttpControllersApiUsersController no existe
¡Está bien! Todo lo que tenemos que hacer es construir un nuevo controlador. ¡Aquí vamos!
vagrant @ homestead: ~ / Code / forumio $ php artisan make: controller Api / UsersController Controlador creado con éxito.
Tenga en cuenta cómo prefijamos el nombre del controlador con la cadena de 'Api'. Esto crea automáticamente un nuevo directorio para nuestros controladores API y coloca este nuevo UsersController en el directorio por nosotros. Ahora que nuestra clase está creada, podemos ejecutar la prueba una vez más.
vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_it_can_fetch_all_mentmented_users_starting_with_the_given_characters PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores. E 1/1 (100%) Tiempo: 845 ms, memoria: 8,00 MB Hubo 1 error: 1) TestsFeatureMentionUsersTest :: test_it_can_fetch_all_mentmented_users_starting_with_the_given_characters BadMethodCallException: el método [índice] no existe en [AppHttpControllersApiUsersController].
Parece que nos falta el método index (). ¡Fácil solución!
El método de índice aún no hace nada, pero debería borrar el error anterior en la prueba y acercarnos un paso más al verde. Podemos ejecutar la prueba de nuevo para ver qué tenemos que hacer.
vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_it_can_fetch_all_mentmented_users_starting_with_the_given_characters PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores. F 1/1 (100%) Tiempo: 810 ms, memoria: 10,00 MB Hubo 1 falla: 1) TestsFeatureMentionUsersTest :: test_it_can_fetch_all_mentmented_users_starting_with_the_given_characters Se devolvió JSON no válido de la ruta.
Ok, se devuelve un json no válido. Podemos arreglarlo. En primer lugar, ¿qué necesitamos que haga este método index ()? Bueno, va a hacer una consulta a la base de datos. Específicamente, va a consultar el modelo de usuario, por lo que debemos hacer uso de eso. Ahora, usaremos una cláusula "where" usando los datos pasados desde la interfaz. Una vez que se completa, devolvemos los resultados como json. Así es como debería verse ahora.
Con eso, vemos mi color favorito. ¡VERDE!
Eso significa que esto debería funcionar ahora en el navegador. Si lo intentamos, funciona. Las posibles coincidencias están apareciendo, ¡pero no como podríamos esperar!
Adición de At.js CSS
Entonces, la razón por la que las cosas se ven raras hasta ahora es que no tenemos un estilo para formatear correctamente los resultados de la sugerencia automática. Sin embargo, podemos solucionarlo copiando el css que viene con at.js al directorio público de nuestra aplicación. Primero creamos el nuevo directorio dentro de public / css, luego copiamos el contenido.
vagrant @ homestead: ~ / Code / forumio $ mkdir public / css / vendor vagrant @ homestead: ~ / Code / forumio $ cp node_modules / at.js / dist / css / jquery.atwho.css ./public/css/vendor/
Hacer referencia selectiva a una hoja de estilo
Ahora necesitamos hacer referencia a esa hoja de estilo para que el estilo tenga efecto en el formulario. Sin embargo, no necesitamos esta hoja de estilo en ningún otro lugar de la aplicación, por lo que debemos usarla solo cuando sea necesario. En realidad, esto es bastante fácil de hacer. En threads / show.blade.php agregaremos este marcado.
Ahora, en el archivo de diseño principal app.blade.php, podemos agregar la línea resaltada.
Esto nos permite agregar la hoja de estilo necesaria a pedido, por así decirlo. ¡¿Y mirarás eso ?! ¡Frio!
Vincular nombres de usuario
Lo último que podemos hacer en este tutorial es asegurarnos de que los nombres de usuario estén vinculados o envueltos en una etiqueta de anclaje al mencionar a un usuario. En el modelo Reply.php, podemos agregar una función pública para establecer el atributo del cuerpo de esa manera. Esto solo hace uso de una práctica expresión regular para crear un hipervínculo para los perfiles de usuario.
También necesitaremos hacer un pequeño ajuste en el componente Reply.vue. Tenga en cuenta que ahora usamos v-html en lugar de v-text.
Ahora nuestros nombres de usuario se vinculan y podemos hacer clic para ver sus perfiles.
jQuery Autocompletar mientras escribe Resumen
Pudimos hacer que la función de sugerencia automática funcionara en nuestra aplicación utilizando el muy útil complemento jQuery at.js. Una vez que agregamos una pequeña cantidad de marcado al front-end, tuvimos que configurar una API en el backend para devolver las posibles coincidencias. Además, tuvimos que copiar algunos CSS personalizados para representar el autocompletado de los nombres de usuario para que se vean elegantes en el navegador.
0 Comentarios