Ember.js ember-data и междоменные запросы ajax
Люди! Какие-нибудь примеры использования ember-data для хранения данных, полученных с удаленного сервера с междоменным запросом ajax? Теперь у меня есть это, но...
TravelClient.Tour = Ember.Object.extend({
});
TravelClient.Tour.reopenClass({
allTours: [],
find: function(){
$.ajax({
url: 'http://someIP:somePORT/tours.json',
dataType: 'jsonp',
context: this,
success: function(data){
data.forEach(function(tour){
this.allTours.addObject(TravelClient.Tour.create(tour))
}, this)
}
})
return this.allTours;
}
});
ОБНОВЛЕНИЕ: Теперь я делаю это таким образом:
TravelClient.Tour.reopenClass({
allTours: [],
find: function(){
$.ajax({
url: 'http://someIP:somePORT/tours.json',
dataType: 'jsonp',
context: this,
success: function(response){
response.data.forEach(function(tour){
this.allTours.addObject(TravelClient.Tour.create(tour))
}, this)
}
})
return this.allTours;
}
});
Но получите эту ошибку:
Uncaught TypeError: Cannot call method 'forEach' of undefined
ПАНОРАМА:
с этим:
$.ajax({
dataType: 'jsonp',
url:"http://192.168.1.39:3000/tours.json",
success:function(response){
return response.data;
}
});
Я получаю это:
Object
abort: function (e){var t=e||S;return r&&r.abort(t),N(0,t),this}
always: function (){return i.done(arguments).fail(arguments),this}
complete: function (){if(a){var t=a.length;(function r(t){y.each(t,function(t,n){var i=y.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this}
done: function (){if(a){var t=a.length;(function r(t){y.each(t,function(t,n){var i=y.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this}
error: function (){if(a){var t=a.length;(function r(t){y.each(t,function(t,n){var i=y.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this}
fail: function (){if(a){var t=a.length;(function r(t){y.each(t,function(t,n){var i=y.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this}
getAllResponseHeaders: function (){return E===2?s:null}
getResponseHeader: function (e){var t;if(E===2){if(!o){o={};while(t=wn.exec(s))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return t==null?null:t}
overrideMimeType: function (e){return E||(c.mimeType=e),this}
pipe: function (){var e=arguments;return y.Deferred(function(n){y.each(t,function(t,s){var o=s[0],u=y.isFunction(e[t])&&e[t];i[s[1]](function(){var e=u&&u.apply(this,arguments);e&&y.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o+"With"](this===r?n.promise():this,u?[e]:arguments)})}),e=null}).promise()}
progress: function (){if(a){var t=a.length;(function r(t){y.each(t,function(t,n){var i=y.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this}
promise: function (e){return e!=null?y.extend(e,r):r}
readyState: 4
setRequestHeader: function (e,t){var n=e.toLowerCase();return E||(e=b[n]=b[n]||e,g[e]=t),this}
state: function (){return n}
status: 200
statusCode: function (e){var t;if(e)if(E<2)for(t in e)m[t]=[m[t],e[t]];else x.always(e[x.status]);return this}
statusText: "success"
success: function (){if(a){var t=a.length;(function r(t){y.each(t,function(t,n){var i=y.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this}
then: function (){var e=arguments;return y.Deferred(function(n){y.each(t,function(t,s){var o=s[0],u=y.isFunction(e[t])&&e[t];i[s[1]](function(){var e=u&&u.apply(this,arguments);e&&y.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o+"With"](this===r?n.promise():this,u?[e]:arguments)})}),e=null}).promise()}
__proto__: Object
1 ответ
Это больше о том, как сервер должен возвращать данные клиенту, чем о ember-data, что вам нужно сделать, это обернуть ответ на вызов ajax в обратный вызов, значение которого отправляется на сервер как параметр. Как только вы это сделаете, для ember-данных это станет обычным делом, то есть достаточно прозрачным для него.
Вот пример использования ruby на рельсах
На стороне клиента
$.ajax({
dataType: 'jsonp',
success: function(response) {
// loop through your objects
response.accounts.forEach(function(account){
console.info(account.id)
})
}
});
На стороне сервера вы должны сделать что-то похожее на
params[:callback] + '("' + response + '");';
Получив, например, ответ, похожий на:
callbackValue00923411(
{
"accounts":
[
{
"id": 123,
"name": "Personal",
},
{
"id": 234,
"name": "Corporate",
}
]
}
);
Затем в функции успеха вы получаете доступ к списку учетных записей, как я уже говорил выше, таким образом,
success: function(response) {
// loop through your objects
response.accounts.forEach(function(account){
console.info(account.id)
})
}
Вот пример того, как использовать / обрабатывать jsonp ajax-запрос
Если у вас есть доступ к серверу, вы можете настроить его на использование CORS и избегать использования jsonp