Mixin Vue.js untuk mengambil template melalui 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"
}
} )
} )
Kode di atas mengambil fragmen HTML dari /hello
melalui Ajax. Kami menyebutnya templat jarak jauh . Templat jarak jauh dikompilasi ke dalam templat Vue, dan digunakan untuk membuat pohon DOM ke elemen <div>
target.
Saat templat jarak jauh diambil, komponen Vue dibuat secara dinamis.
Dan jika templat jarak jauh berisi arahan v-model
, data komponen diinisialisasi menggunakan fungsi getInitialData
dari paket vue-data-scooper.
< form >
< input type =" text " name =" user[name] " v-model =" user.name " value =" Alice " >
</ form >
Templat jarak jauh di atas menyetel properti user.name
komponen ke string "Alice".
Tanggal respons dari server backend dapat berupa string atau data JSON.
Dalam kasus sebelumnya, string akan ditafsirkan sebagai templat jarak jauh.
Dalam kasus terakhir, data JSON harus memiliki kunci template
dan kunci data
opsional. Nilai kunci template
akan diartikan sebagai templat jarak jauh. Nilai kunci data
akan digunakan sebagai data awal komponen Vue.
Misalnya, ketika server mengembalikan data JSON berikut:
{
"template" : " <div>{{ message }}</div> " ,
"data" : { "message" : " Hello, world! " }
}
Kemudian, fragmen HTML yang dihasilkan adalah <div>Hello, world!</div>
.
Perhatikan bahwa data awal yang disediakan oleh data JSON dari server menimpa kumpulan data oleh arahan v-model
.
Jika Anda ingin menginisialisasi properti komponen yang tidak terikat pada input melalui direktif v-model
, Anda harus menyediakan ekstensi .
// greeting.js
export const greeting = {
data : function ( ) {
return {
name : "Alice"
}
}
}
Ekstensi adalah mixin yang akan digunakan saat komponen dibuat.
Anda dapat mendaftarkan ekstensi ke properti 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
}
}
} )
} )
Nama ekstensi harus ditentukan oleh atribut data-extension
dari elemen akar templat jarak jauh:
< div data-extension =" greeting " >
< div > Hello, {{name}}! </ div >
</ div >
Templat di atas menghasilkan fragmen HTML berikut:
< div data-extension =" greeting " >
< div > Hello, Alice! </ div >
</ div >
visit
Anda dapat memanggil metode visit
untuk mengganti templat jarak jauh.
< div >
< button type =" button " @click =" visit('/goodbye') " > Click me! </ button >
</ div >
Ketika pengguna mengklik tombol ini di browser, akses Ajax ke /goodbye
dijalankan dan template jarak jauh diambil.
Jika elemen akar template yang baru diambil memiliki atribut data-title
, nilainya diatur ke judul dokumen.
Dan, elemen root template yang baru diambil memiliki atribut data-url
, nilainya digunakan untuk menambahkan entri ke riwayat browser menggunakan metode window.history.pushState().
Berikut ini contoh templat jarak jauh:
< div data-extension =" greeting " data-title =" Farewell " data-url =" /bye " >
< div > Goodbye, {{name}}! </ div >
</ div >
Jika Anda menggunakan metode visit
pada elemen a
, Anda dapat menghilangkan argumen pada metode tersebut. Nilai href
elemen a
ditafsirkan sebagai jalur templat jarak jauh.
< div >
< a href =" /goodbye " @click.prevent =" visit " > Click me! </ a >
</ div >
Perhatikan bahwa Anda harus mencegah tindakan default agar browser tidak mengunjungi jalur yang ditentukan sebenarnya.
submit
Anda dapat memanggil metode submit
untuk mengirimkan data formulir melalui panggilan 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 >
Ketika pengguna mengklik tombol "Perbarui", permintaan Ajax melalui metode PATCH
dikirimkan ke /users/123
.
Jika server mengembalikan teks, itu digunakan sebagai templat jarak jauh untuk menampilkan hasilnya. Jika server mengembalikan objek JSON, objek tersebut harus berisi kunci templatePath
, yang nilainya digunakan untuk membuat permintaan Ajax lain guna mengambil template jarak jauh.
Perhatikan bahwa metode submit
harus dipanggil pada elemen <form>
. Anda tidak dapat memanggilnya pada elemen dalam formulir.
Perhatikan juga bahwa metode panggilan Ajax ditentukan oleh nilai elemen tersembunyi yang bernama _method
.
Lihat https://github.com/kuroda/vue-rails-form-builder-demo.
# install dependencies
yarn install
# test
yarn test
Anda memerlukan Google Chrome versi 59 atau lebih tinggi untuk menjalankan pengujian. Jika Anda menggunakan google-chrome-beta
, ekspor variabel lingkungan CHROME_BIN
:
export CHROME_BIN= $( which google-chrome-beta )
yarn build