underscore tutorial significado react meaning backbonejs backbone rest backbone.js

rest - tutorial - Backbone.js ¿Modelo de url diferente para crear y actualizar?



backbonejs github (5)

¿Está lidiando con una implementación de REST que no cumple con las especificaciones o necesita algún tipo de solución alternativa?

En su lugar, considere usar la opción emulateHTTP encuentra aquí:

http://documentcloud.github.com/backbone/#Sync

De lo contrario, probablemente solo necesites sobreescribir el método Backbone.sync predeterminado y estarás listo si te vuelves loco con eso ... pero no sugiero eso. Lo mejor sería usar una verdadera interfaz RESTful.

digamos que tengo un modelo Backbone y creo una instancia de un modelo como este:

var User = Backbone.Model.extend({ ... }); var John = new User({ name : ''John'', age : 33 });

Me pregunto si es posible cuando uso John.save() para apuntar /user/create cuando uso John.save() por segunda vez (update / PUT) para apuntar /user/update cuando uso John.fetch() para apuntar /user/get y cuando uso John.remove() para target /user/remove

Sé que podría definir John.url cada vez antes de desencadenar cualquier método, pero me pregunto si podría suceder automáticamente de alguna manera sin anular ningún método Backbone.

Sé que podría usar una url como /user/handle y manejar la solicitud según el método de solicitud (GET / POST / PUT / DELETE) pero me pregunto si hay una forma de tener diferentes url por acción en Backbone.

¡Gracias!


Los métodos .fetch() , .save() y .destroy() en Backbone.Model están comprobando si el modelo tiene definido .sync() y si es así se llamará, de lo contrario se llamará a Backbone.sync() (ver último líneas del código fuente vinculado).

Entonces, una de las soluciones es implementar el método .sync() .

Ejemplo:

var User = Backbone.Model.extend({ // ... methodToURL: { ''read'': ''/user/get'', ''create'': ''/user/create'', ''update'': ''/user/update'', ''delete'': ''/user/remove'' }, sync: function(method, model, options) { options = options || {}; options.url = model.methodToURL[method.toLowerCase()]; return Backbone.sync.apply(this, arguments); } }


Me inspiré en this solución, donde simplemente creas tu propia llamada ajax para los métodos que no son para buscar el modelo. Aquí hay una versión recortada del mismo:

var Backbone = require("backbone"); var $ = require("jquery"); var _ = require("underscore"); function _request(url, method, data, callback) { $.ajax({ url: url, contentType: "application/json", dataType: "json", type: method, data: JSON.stringify( data ), success: function (response) { if ( !response.error ) { if ( callback && _.isFunction(callback.success) ) { callback.success(response); } } else { if ( callback && _.isFunction(callback.error) ) { callback.error(response); } } }, error: function(mod, response){ if ( callback && _.isFunction(callback.error) ) { callback.error(response); } } }); } var User = Backbone.Model.extend({ initialize: function() { _.bindAll(this, "login", "logout", "signup"); }, login: function (data, callback) { _request("api/auth/login", "POST", data, callback); }, logout: function (callback) { if (this.isLoggedIn()) { _request("api/auth/logout", "GET", null, callback); } }, signup: function (data, callback) { _request(url, "POST", data, callback); }, url: "api/auth/user" }); module.exports = User;

Y luego puedes usarlo así:

var user = new User(); // user signup user.signup(data, { success: function (response) { // signup success } }); // user login user.login(data, { success: function (response) { // login success } }); // user logout user.login({ success: function (response) { // logout success } }); // fetch user details user.fetch({ success: function () { // logged in, go to home window.location.hash = ""; }, error: function () { // logged out, go to signin window.location.hash = "signin"; } });


No, no puedes hacer esto por defecto con la red troncal. Lo que podría hacer es agregar al modelo que cambiará la URL del modelo en cada evento que desencadene el modelo. Pero siempre tiene el problema de que bckbone utilizará POST add la primera vez que se guardó el modelo y PUT para cada llamada después. Por lo tanto, debe sobrescribir el método save() o Backbone.sync también.

Después de todo, parece que no es una buena idea hacer esto porque rompe el patrón REST Backbone está basado en.


Para abstraer un paso más la solución de dzejkej , puede ajustar la función Backbone.sync para consultar el modelo de URL específicas del método .

function setDefaultUrlOptionByMethod(syncFunc) return function sync (method, model, options) { options = options || {}; if (!options.url) options.url = _.result(model, method + ''Url''); // Let Backbone.sync handle model.url fallback value return syncFunc.call(this, method, model, options); } }

Entonces podrías definir el modelo con:

var User = Backbone.Model.extend({ sync: setDefaultUrlOptionByMethod(Backbone.sync), readUrl: ''/user/get'', createUrl: ''/user/create'', updateUrl: ''/user/update'', deleteUrl: ''/user/delete'' });