mirror of
https://github.com/discourse/discourse.git
synced 2024-11-28 06:33:38 +08:00
Moved Discourse.ajax into a mixin.
This commit is contained in:
parent
20f3707fbe
commit
894dc2c6fd
|
@ -7,7 +7,7 @@
|
|||
@class Discourse
|
||||
@extends Ember.Application
|
||||
**/
|
||||
Discourse = Ember.Application.createWithMixins({
|
||||
Discourse = Ember.Application.createWithMixins(Discourse.Ajax, {
|
||||
rootElement: '#main',
|
||||
|
||||
// Whether the app has focus or not
|
||||
|
@ -181,71 +181,6 @@ Discourse = Ember.Application.createWithMixins({
|
|||
if(this.get('loginRequired')) { route.transitionTo('login'); }
|
||||
},
|
||||
|
||||
/**
|
||||
Our own $.ajax method. Makes sure the .then method executes in an Ember runloop
|
||||
for performance reasons. Also automatically adjusts the URL to support installs
|
||||
in subfolders.
|
||||
|
||||
@method ajax
|
||||
**/
|
||||
ajax: function() {
|
||||
|
||||
var url, args;
|
||||
|
||||
if (arguments.length === 1) {
|
||||
if (typeof arguments[0] === "string") {
|
||||
url = arguments[0];
|
||||
args = {};
|
||||
} else {
|
||||
args = arguments[0];
|
||||
url = args.url;
|
||||
delete args.url;
|
||||
}
|
||||
} else if (arguments.length === 2) {
|
||||
url = arguments[0];
|
||||
args = arguments[1];
|
||||
}
|
||||
|
||||
if (args.success) {
|
||||
console.warning("DEPRECATION: Discourse.ajax should use promises, received 'success' callback");
|
||||
}
|
||||
if (args.error) {
|
||||
console.warning("DEPRECATION: Discourse.ajax should use promises, received 'error' callback");
|
||||
}
|
||||
|
||||
// If we have URL_FIXTURES, load from there instead (testing)
|
||||
var fixture = Discourse.URL_FIXTURES && Discourse.URL_FIXTURES[url];
|
||||
if (fixture) {
|
||||
return Ember.RSVP.resolve(fixture);
|
||||
}
|
||||
|
||||
return Ember.Deferred.promise(function (promise) {
|
||||
var oldSuccess = args.success;
|
||||
args.success = function(xhr) {
|
||||
Ember.run(promise, promise.resolve, xhr);
|
||||
if (oldSuccess) oldSuccess(xhr);
|
||||
};
|
||||
|
||||
var oldError = args.error;
|
||||
args.error = function(xhr) {
|
||||
|
||||
// If it's a parseerror, don't reject
|
||||
if (xhr.status === 200) return args.success(xhr);
|
||||
|
||||
promise.reject(xhr);
|
||||
if (oldError) oldError(xhr);
|
||||
};
|
||||
|
||||
// We default to JSON on GET. If we don't, sometimes if the server doesn't return the proper header
|
||||
// it will not be parsed as an object.
|
||||
if (!args.type) args.type = 'GET';
|
||||
if ((!args.dataType) && (args.type === 'GET')) args.dataType = 'json';
|
||||
|
||||
$.ajax(Discourse.getURL(url), args);
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
Subscribes the current user to receive message bus notifications
|
||||
**/
|
||||
|
|
80
app/assets/javascripts/discourse/mixins/ajax.js
Normal file
80
app/assets/javascripts/discourse/mixins/ajax.js
Normal file
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
This mixin provides an 'ajax' method that can be used to perform ajax requests that
|
||||
respect Discourse paths and the run loop.
|
||||
|
||||
@class Discourse.Ajax
|
||||
@extends Ember.Mixin
|
||||
@namespace Discourse
|
||||
@module Discourse
|
||||
**/
|
||||
Discourse.Ajax = Em.Mixin.create({
|
||||
|
||||
/**
|
||||
Our own $.ajax method. Makes sure the .then method executes in an Ember runloop
|
||||
for performance reasons. Also automatically adjusts the URL to support installs
|
||||
in subfolders.
|
||||
|
||||
@method ajax
|
||||
**/
|
||||
ajax: function() {
|
||||
var url, args;
|
||||
|
||||
if (arguments.length === 1) {
|
||||
if (typeof arguments[0] === "string") {
|
||||
url = arguments[0];
|
||||
args = {};
|
||||
} else {
|
||||
args = arguments[0];
|
||||
url = args.url;
|
||||
delete args.url;
|
||||
}
|
||||
} else if (arguments.length === 2) {
|
||||
url = arguments[0];
|
||||
args = arguments[1];
|
||||
}
|
||||
|
||||
if (args.success) {
|
||||
console.warning("DEPRECATION: Discourse.ajax should use promises, received 'success' callback");
|
||||
}
|
||||
if (args.error) {
|
||||
console.warning("DEPRECATION: Discourse.ajax should use promises, received 'error' callback");
|
||||
}
|
||||
|
||||
// If we have URL_FIXTURES, load from there instead (testing)
|
||||
var fixture = Discourse.URL_FIXTURES && Discourse.URL_FIXTURES[url];
|
||||
if (fixture) {
|
||||
return Ember.RSVP.resolve(fixture);
|
||||
}
|
||||
|
||||
return Ember.Deferred.promise(function (promise) {
|
||||
var oldSuccess = args.success;
|
||||
args.success = function(xhr) {
|
||||
Ember.run(promise, promise.resolve, xhr);
|
||||
if (oldSuccess) oldSuccess(xhr);
|
||||
};
|
||||
|
||||
var oldError = args.error;
|
||||
args.error = function(xhr) {
|
||||
|
||||
// If it's a parseerror, don't reject
|
||||
if (xhr.status === 200) return args.success(xhr);
|
||||
|
||||
promise.reject(xhr);
|
||||
if (oldError) oldError(xhr);
|
||||
};
|
||||
|
||||
// We default to JSON on GET. If we don't, sometimes if the server doesn't return the proper header
|
||||
// it will not be parsed as an object.
|
||||
if (!args.type) args.type = 'GET';
|
||||
if ((!args.dataType) && (args.type === 'GET')) args.dataType = 'json';
|
||||
|
||||
$.ajax(Discourse.getURL(url), args);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -4,6 +4,7 @@
|
|||
//= require_tree ./external
|
||||
|
||||
//= require ./discourse/helpers/i18n_helpers
|
||||
//= require ./discourse/mixins/ajax
|
||||
//= require ./discourse
|
||||
|
||||
// Pagedown customizations
|
||||
|
|
Loading…
Reference in New Issue
Block a user