Um mixin Vue.js para buscar modelo via Ajax
< html >
< body >
< div id =" app " > </ div >
< script src =" /app.js " > </ script >
</ body >
</ html > // app.js
import Vue from "vue/dist/vue.esm"
import VueRemoteTemplate from "vue-remote-template"
document . addEventListener ( "DOMContentLoaded" , ( ) => {
new Vue ( {
mixins : [ VueRemoteTemplate ] ,
el : "#app" ,
data : {
templatePath : "/hello"
}
} )
} ) O código acima busca um fragmento HTML de /hello via Ajax. Chamamos esse modelo remoto . Modelos remotos são compilados em modelos Vue e usados para construir uma árvore DOM no elemento <div> de destino.
Quando um modelo remoto é obtido, um componente Vue é criado dinamicamente.
E se os modelos remotos contiverem diretivas v-model , os dados do componente serão inicializados usando a função getInitialData do pacote vue-data-scooper.
< form >
< input type =" text " name =" user[name] " v-model =" user.name " value =" Alice " >
</ form > O modelo remoto acima define a propriedade user.name do componente como a string "Alice".
A data de resposta do servidor back-end pode ser uma string ou dados JSON.
No primeiro caso, a string será interpretada como o modelo remoto.
Neste último caso, os dados JSON devem ter chave template e chave data opcional. O valor da chave template será interpretado como o modelo remoto. O valor da chave data será usado como os dados iniciais do componente Vue.
Por exemplo, quando o servidor retorna os seguintes dados JSON:
{
"template" : " <div>{{ message }}</div> " ,
"data" : { "message" : " Hello, world! " }
} Então, o fragmento HTML resultante será <div>Hello, world!</div> .
Observe que os dados iniciais fornecidos pelos dados JSON do servidor substituem os dados definidos pelas diretivas v-model .
Se você deseja inicializar as propriedades do componente que não estão vinculadas a uma entrada por meio da diretiva v-model , você deve fornecer uma extensão .
// greeting.js
export const greeting = {
data : function ( ) {
return {
name : "Alice"
}
}
}Uma extensão é um mixin a ser usado quando o componente é criado.
Você pode registrar extensões na propriedade extensions .
// app.js
import Vue from "vue/dist/vue.esm"
import VueRemoteTemplate from "vue-remote-template"
import { greeting } from "./greeting"
document . addEventListener ( "DOMContentLoaded" , ( ) => {
new Vue ( {
mixins : [ VueRemoteTemplate ] ,
el : "#app" ,
data : {
templatePath : "/hello" ,
extensions : {
greeting : greeting
}
}
} )
} ) O nome da extensão deve ser especificado pelo atributo data-extension do elemento raiz do modelo remoto:
< div data-extension =" greeting " >
< div > Hello, {{name}}! </ div >
</ div >O modelo acima produz o seguinte fragmento HTML:
< div data-extension =" greeting " >
< div > Hello, Alice! </ div >
</ div > visit Você pode chamar o método visit para alternar o modelo remoto.
< div >
< button type =" button " @click =" visit('/goodbye') " > Click me! </ button >
</ div > Quando o usuário clica neste botão no navegador, um acesso Ajax para /goodbye é executado e um modelo remoto é obtido.
Se o elemento raiz de um modelo recém-buscado tiver o atributo data-title , seu valor será definido como o título do documento.
E, o elemento raiz de um modelo recém-buscado tem o atributo data-url , seu valor é usado para adicionar uma entrada ao histórico do navegador usando o método window.history.pushState().
Aqui está um exemplo de modelo remoto:
< div data-extension =" greeting " data-title =" Farewell " data-url =" /bye " >
< div > Goodbye, {{name}}! </ div >
</ div > Se você usar o método visit em um elemento a , poderá omitir o argumento do método. O valor href do elemento a é interpretado como o caminho do modelo remoto.
< div >
< a href =" /goodbye " @click.prevent =" visit " > Click me! </ a >
</ div >Observe que você deve impedir a ação padrão para que o navegador não visite realmente o caminho especificado.
submit Você pode chamar o método submit para enviar dados do formulário por meio de uma chamada Ajax.
< form action =" /users/123 " method =" post " @submit.prevent =" submit " >
< input type =" hidden " name =" _method " value =" patch " >
< input type =" text " name =" user[name] " v-model =" user.name " value =" Alice " >
< input type =" submit " value =" Update " >
</ form > Quando o usuário clica no botão "Atualizar", uma solicitação Ajax via método PATCH é enviada ao /users/123 .
Se o servidor retornar um texto, ele será usado como modelo remoto para mostrar o resultado. Se o servidor retornar um objeto JSON, ele deverá conter a chave templatePath , cujo valor será usado para fazer outra solicitação Ajax para buscar um modelo remoto.
Observe que o método submit deve ser chamado no elemento <form> . Você não pode chamá-lo nos elementos de um formulário.
Observe também que o método de chamada Ajax é determinado pelo valor de um elemento oculto cujo nome é _method .
Consulte https://github.com/kuroda/vue-rails-form-builder-demo.
# install dependencies
yarn install
# test
yarn test Você precisa do Google Chrome versão 59 ou superior para executar o teste. Se você usar google-chrome-beta , exporte a variável de ambiente CHROME_BIN :
export CHROME_BIN= $( which google-chrome-beta ) yarn build