Layanan untuk membuat permintaan AJAX di aplikasi Ember.
ember-ajax
sekarang sudah tidak digunakan lagi. Harap pertimbangkan untuk menggunakan ember-fetch
, atau ember-ajax-fetch
sebagai pengganti yang lebih langsung.
Jika Anda baru memulai, Anda sudah menginstal ember-ajax
! Namun, jika tidak ada di package.json
Anda, Anda dapat menambahkannya dengan melakukan:
ember install ember-ajax
Untuk menggunakan layanan ajax, masukkan layanan ajax
ke rute atau komponen Anda.
import Ember from 'ember' ;
export default Ember . Route . extend ( {
ajax : Ember . inject . service ( ) ,
model ( ) {
return this . get ( 'ajax' ) . request ( '/posts' ) ;
}
} ) ;
Layanan AJAX menyediakan metode yang digunakan untuk membuat permintaan AJAX, mirip dengan cara Anda menggunakan jQuery.ajax
. Faktanya, ember-ajax
adalah pembungkus metode jQuery, dan dapat dikonfigurasi dengan cara yang hampir sama.
Secara umum, Anda akan menggunakan metode request(url, options)
, di mana url
adalah tujuan permintaan dan options
adalah hash konfigurasi untuk jQuery.ajax
.
import Ember from 'ember' ;
export default Ember . Controller . extend ( {
ajax : Ember . inject . service ( ) ,
actions : {
sendRequest ( ) {
return this . get ( 'ajax' ) . request ( '/posts' , {
method : 'POST' ,
data : {
foo : 'bar'
}
} ) ;
}
}
} ) ;
Dalam contoh ini, this.get('ajax').request()
akan mengembalikan janji dengan hasil permintaan. Kode handler Anda di dalam .then
atau .catch
akan secara otomatis dibungkus dalam loop proses Ember untuk kompatibilitas maksimum dengan Ember, langsung dari kotaknya.
Anda dapat melewati pengaturan method
atau type
kunci di objek options
Anda saat memanggil request(url, options)
dengan memanggil post(url, options)
, put(url, options)
, patch(url, options)
atau del(url, options)
.
post ( '/posts' , { data : { title : 'Ember' } } ) ; // Makes a POST request to /posts
put ( '/posts/1' , { data : { title : 'Ember' } } ) ; // Makes a PUT request to /posts/1
patch ( '/posts/1' , { data : { title : 'Ember' } } ) ; // Makes a PATCH request to /posts/1
del ( '/posts/1' ) ; // Makes a DELETE request to /posts/1
ember-ajax
memungkinkan Anda menentukan header yang akan digunakan dengan permintaan. Hal ini sangat berguna ketika Anda memiliki layanan sesi yang menyediakan token autentikasi yang harus Anda sertakan dalam permintaan untuk mengotorisasi permintaan Anda.
Untuk menyertakan header khusus yang akan digunakan dengan permintaan Anda, Anda dapat menentukan hash headers
pada Ajax Service
.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
session : Ember . inject . service ( ) ,
headers : Ember . computed ( 'session.authToken' , {
get ( ) {
let headers = { } ;
const authToken = this . get ( 'session.authToken' ) ;
if ( authToken ) {
headers [ 'auth-token' ] = authToken ;
}
return headers ;
}
} )
} ) ;
Header secara default hanya diteruskan jika hostnya cocok, atau permintaannya adalah jalur relatif. Anda dapat menimpa perilaku ini dengan meneruskan host bersama permintaan, mengatur host untuk layanan ajax, atau dengan mengatur array trustedHosts
yang dapat berupa array string atau regex.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
trustedHosts : [ / .example. / , 'foo.bar.com' ]
} ) ;
Properti namespace
dapat digunakan untuk mengawali permintaan dengan namespace url tertentu.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
namespace : '/api/v1'
} ) ;
request('/users/me')
sekarang akan menargetkan /api/v1/users/me
Jika Anda perlu mengganti namespace untuk permintaan khusus, gunakan namespace
sebagai opsi pada metode permintaan.
// GET /api/legacy/users/me
request ( '/users/me' , { namespace : '/api/legacy' } ) ;
ember-ajax
memungkinkan Anda menentukan host yang akan digunakan dengan permintaan. Ini sangat membantu sehingga Anda tidak perlu terus-menerus meneruskan host beserta jalurnya, membuat request()
sedikit lebih bersih.
Untuk menyertakan host khusus yang akan digunakan dengan permintaan Anda, Anda dapat menentukan properti host
di Ajax Service
.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
host : 'http://api.example.com'
} ) ;
Itu memungkinkan Anda hanya perlu melakukan panggilan ke request()
seperti:
// GET http://api.example.com/users/me
request ( '/users/me' ) ;
ember-ajax
memungkinkan Anda menentukan header Tipe Konten default untuk digunakan dengan permintaan.
Untuk menyertakan Tipe Konten khusus, Anda dapat menentukan properti contentType
di Ajax Service
.
// app/services/ajax.js
import Ember from 'ember' ;
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
contentType : 'application/json; charset=utf-8'
} ) ;
Anda juga dapat mengganti Tipe Konten per request
dengan parameter options
.
Beberapa API merespons dengan kode status 200, meskipun telah terjadi kesalahan dan memberikan kode status di payload. Dengan layanan ini, Anda dapat dengan mudah menjelaskan perilaku ini dengan menimpa metode isSuccess
.
// app/services/ajax.js
import AjaxService from 'ember-ajax/services/ajax' ;
export default AjaxService . extend ( {
isSuccess ( status , headers , payload ) {
let isSuccess = this . _super ( ... arguments ) ;
if ( isSuccess && payload . status ) {
// when status === 200 and payload has status property,
// check that payload.status is also considered a success request
return this . _super ( payload . status ) ;
}
return isSuccess ;
}
} ) ;
ember-ajax
menyediakan kelas kesalahan bawaan yang dapat Anda gunakan untuk memeriksa kesalahan yang dihasilkan oleh respons. Hal ini memungkinkan Anda membatasi penentuan hasil kesalahan pada layanan alih-alih menyebarkannya ke sekitar kode Anda.
ember-ajax
memiliki tipe kesalahan bawaan yang akan dikembalikan dari layanan jika terjadi kesalahan:
BadRequestError
(400)UnauthorizedError
(401)ForbiddenError
(403)NotFoundError
(404)InvalidError
(422)ServerError
(5XX)AbortError
TimeoutError
Semua kesalahan di atas adalah subtipe dari AjaxError
.
ember-ajax
hadir dengan fungsi pembantu untuk mencocokkan kesalahan respons dengan jenis kesalahan ember-ajax
masing-masing. Masing-masing kesalahan yang tercantum di atas memiliki fungsi is*
yang sesuai (misalnya, isBadRequestError
).
Penggunaan fungsi-fungsi ini sangat dianjurkan untuk membantu menghilangkan kebutuhan akan kode deteksi kesalahan boilerplate.
import Ember from 'ember' ;
import {
isAjaxError ,
isNotFoundError ,
isForbiddenError
} from 'ember-ajax/errors' ;
export default Ember . Route . extend ( {
ajax : Ember . inject . service ( ) ,
model ( ) {
const ajax = this . get ( 'ajax' ) ;
return ajax . request ( '/user/doesnotexist' ) . catch ( function ( error ) {
if ( isNotFoundError ( error ) ) {
// handle 404 errors here
return ;
}
if ( isForbiddenError ( error ) ) {
// handle 403 errors here
return ;
}
if ( isAjaxError ( error ) ) {
// handle all other AjaxErrors here
return ;
}
// other errors are handled elsewhere
throw error ;
} ) ;
}
} ) ;
Jika kesalahan Anda tidak standar, fungsi pembantu untuk jenis kesalahan tersebut dapat digunakan sebagai dasar untuk membangun fungsi deteksi kustom Anda.
Jika Anda perlu mengakses respons json dari permintaan yang gagal, Anda dapat menggunakan metode raw
alih-alih request
.
this . get ( 'ajax' )
. raw ( url , options )
. then ( ( { response } ) => this . handleSuccess ( response ) )
. catch ( ( { response , jqXHR , payload } ) => this . handleError ( response ) ) ;
Perhatikan bahwa dalam kasus penggunaan ini tidak ada akses ke objek kesalahan. Anda dapat memeriksa objek jqXHR
untuk informasi tambahan tentang permintaan yang gagal. Khususnya jqXHR.status
mengembalikan kode kesalahan HTTP yang relevan.
Ember AJAX menyediakan mixin yang dapat digunakan dalam Adaptor Data Ember untuk menghindari kode jaringan yang disediakan oleh Ember Data dan mengandalkan Ember AJAX sebagai gantinya. Ini berfungsi sebagai langkah pertama menuju integrasi sebenarnya Ember AJAX ke dalam Ember Data.
Untuk menggunakan mixin, Anda dapat memasukkan mixin ke dalam Adaptor, seperti:
// app/adapters/application.js
import DS from 'ember-data' ;
import AjaxServiceSupport from 'ember-ajax/mixins/ajax-support' ;
export default DS . JSONAPIAdapter . extend ( AjaxServiceSupport ) ;
Itu saja konfigurasi yang diperlukan! Jika Anda ingin menyesuaikan adaptor, seperti menggunakan layanan AJAX alternatif (seperti yang Anda kembangkan sendiri), tersedia kaitan untuk melakukannya; lihat implementasi mixin untuk detailnya.
Perhatikan bahwa alih-alih menggunakan kode pemeriksaan kesalahan Ember Data di aplikasi Anda, Anda harus menggunakan kode yang disediakan oleh Ember AJAX.
Jika Anda tidak menggunakan Ember Data dan tidak memiliki akses ke layanan, Anda dapat mengimpor utilitas ajax seperti:
import request from 'ember-ajax/request' ;
export default function someUtility ( url ) {
var options = {
// request options
} ;
return request ( url , options ) . then ( response => {
// `response` is the data from the server
return response ;
} ) ;
}
Yang akan memiliki API yang sama dengan layanan ajax
. Jika Anda menginginkan objek jQuery XHR mentah maka Anda dapat menggunakan metode raw
sebagai gantinya:
import raw from 'ember-ajax/raw' ;
export default function someOtherUtility ( url ) {
var options = {
// raw options
} ;
return raw ( url , options ) . then ( result => {
// `result` is an object containing `response` and `jqXHR`, among other items
return result ;
} ) ;
}
Informasi ini hanya relevan jika Anda ingin berkontribusi pada ember-ajax
.
git clone
repositori ininpm install
ember server
ember test
ember test --server
ember build
Untuk informasi lebih lanjut tentang penggunaan ember-cli, kunjungi http://www.ember-cli.com/.