2012-01-04 9 views
31

की सुविधा देता है कहते हैं कि मैं एक रीढ़ मॉडल है और मैं इस तरह की एक मॉडल का एक उदाहरण बनाने के लिए:बैकबोन.जेएस मॉडल बनाने और अपडेट करने के लिए मॉडल अलग यूआरएल?

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

मुझे आश्चर्य है अगर यह संभव है जब मैं John.save() का उपयोग /user/create लक्षित करने के लिए जब मैं दूसरी बार (अद्यतन/पर John.save() का उपयोग डाल) /user/update लक्षित करने के लिए जब मैं John.fetch() का उपयोग /user/get लक्षित करने के लिए और जब मैं John.remove() का उपयोग /user/remove

लक्षित करने के लिए मुझे पता है कि मैं John.url हर बार निर्धारित कर सकते हैं इससे पहले कि मैं किसी भी विधि को गति प्रदान लेकिन अगर यह autom होने जा सकता है मैं सोच रहा हूँ कुछ हद तक कैसे किसी भी बैकबोन विधि को ओवरराइड किए बिना।

मुझे पता है कि मैं /user/handle जैसे एक यूआरएल का उपयोग कर सकता हूं और अनुरोध विधि (जीईटी/पोस्ट/पुट/डिलीट) के आधार पर अनुरोध संभाल सकता हूं लेकिन मैं सोच रहा हूं कि बैकबोन में प्रति क्रिया अलग-अलग यूआरएल रखने का कोई तरीका है या नहीं ।

धन्यवाद!

उत्तर

78

तरीके .fetch(), .save() और .destroy()Backbone.Model पर जाँच कर रहे हैं और अगर हां यह कहा जाता हो जाएगा अन्यथा Backbone.sync() (लिंक किए गए स्रोत कोड के अंतिम लाइनों को देखने के) कहा जाता हो जाएगा।

तो समाधानों में से एक .sync() विधि को लागू करना है।

उदाहरण:

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); 
    } 
} 
+13

अच्छा समाधान। 'विकल्प = विकल्प || के बजाय {}; ', आपको' विकल्प || का उपयोग करना चाहिए (विकल्प = {}); 'अनावश्यक पुनर्मूल्यांकन से बचने के लिए। –

+2

@BrianNickel मैं मानता हूं कि आपका कोड अधिक अनुकूलित है लेकिन मैं इसे उत्तर में शामिल करने के लिए थोड़ा सा आरक्षित हूं क्योंकि JSLint/JSHint उपकरण इसे एक समस्या के रूप में चिह्नित कर रहे हैं और मेरी राय में इसे पढ़ने में थोड़ा मुश्किल है ... लेकिन मैं आपको +1 दिया क्योंकि यह ध्यान देने योग्य है :)। – kubetz

+0

धन्यवाद यह बहुत ही dzejkej यह इंगित करने के लिए कि यह पहली बार मॉडल की सिंक विधि को देखेगा, मैंने इसे पूरी तरह से याद किया :) धन्यवाद @ ब्रियन निकल इसे भी इंगित करने के लिए :) – panosru

0

नहीं, आप डिफ़ॉल्ट रूप से रीढ़ की हड्डी के साथ ऐसा नहीं कर सकते हैं। मॉडल में जोड़ने के लिए आप क्या कर सकते हैं जो मॉडल ट्रिगर के हर ईवेंट पर मॉडल यूआरएल बदल देगा। लेकिन फिर आपको हमेशा समस्या है कि बेकबोन POST का उपयोग करेगा जब मॉडल को सहेजा गया था और बाद में प्रत्येक कॉल के लिए PUT जोड़ें। तो आपको save() विधि या Backbone.sync को ओवरराइड करने की आवश्यकता है।

आखिरकार ऐसा करने का अच्छा विचार नहीं है क्योंकि यह REST पैटर्न बैकबोन बना रहा है।

+0

धन्यवाद जबाब एंड्रिया :) के लिए – panosru

1

क्या आप एक आरईएसटी कार्यान्वयन से निपट रहे हैं जो किसी प्रकार के कामकाज की कल्पना या आवश्यकता नहीं है? अन्यथा

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

, तो आप शायद सिर्फ डिफ़ॉल्ट Backbone.sync विधि ओवरराइड करने के लिए की आवश्यकता होगी और आप आगे बढ़ने के हो जाएगा आप प्राप्त करना चाहते हैं:

इसके बजाय, emulateHTTP विकल्प का उपयोग करने पर विचार यहां पाया उसके साथ असली पागल ... लेकिन मैं इसका सुझाव नहीं देता। एक सच्चे रीस्टफुल इंटरफ़ेस का उपयोग करना सबसे अच्छा होगा। अगर मॉडल .sync() परिभाषित है

+0

उत्तर के लिए धन्यवाद :) मैं में ले लेंगे "आसपास हैकिंग" के बजाय आरईएसटी कार्यान्वयन का पालन करने पर विचार :) – panosru

2
सार dzejkej के समाधान करने के लिए

एक स्तर आगे, आप Backbone.sync समारोह विधि-विशिष्ट URL के लिए मॉडल क्वेरी करने के लिए लपेट सकता है।

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

मैं this समाधान है, जहां आप सिर्फ तरीकों कि मॉडल को लाते समय के लिए नहीं कर रहे हैं के लिए अपनी खुद की ajax कॉल बनाने के द्वारा प्रेरित हुआ:

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

तो फिर तुम साथ मॉडल को परिभाषित कर सकते हैं। यहाँ इसके बारे में एक कांट छांट संस्करण है:

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; 

और फिर आप इसे इस तरह उपयोग कर सकते हैं:

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"; 
    } 
}); 
संबंधित मुद्दे