Moved Discourse.ajax into a mixin.

This commit is contained in:
Robin Ward 2013-07-26 15:12:40 -04:00
parent 20f3707fbe
commit 894dc2c6fd
3 changed files with 82 additions and 66 deletions

View File

@ -7,7 +7,7 @@
@class Discourse @class Discourse
@extends Ember.Application @extends Ember.Application
**/ **/
Discourse = Ember.Application.createWithMixins({ Discourse = Ember.Application.createWithMixins(Discourse.Ajax, {
rootElement: '#main', rootElement: '#main',
// Whether the app has focus or not // Whether the app has focus or not
@ -181,71 +181,6 @@ Discourse = Ember.Application.createWithMixins({
if(this.get('loginRequired')) { route.transitionTo('login'); } 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 Subscribes the current user to receive message bus notifications
**/ **/

View 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);
});
}
});

View File

@ -4,6 +4,7 @@
//= require_tree ./external //= require_tree ./external
//= require ./discourse/helpers/i18n_helpers //= require ./discourse/helpers/i18n_helpers
//= require ./discourse/mixins/ajax
//= require ./discourse //= require ./discourse
// Pagedown customizations // Pagedown customizations