2011-11-21 58 views
1

設置默認的API url我如何設置一個默認的url/server爲我的所有請求從集合和模型在Backbone?Backbone collection使用RequireJS

實例集合:

define([ 
    'backbone', 
    '../models/communityModel' 
], function(Backbone, CommunityModel){ 
    return Backbone.Collection.extend({ 
     url: '/communities', // localhost/communities should be api.local/communities 
     model: CommunityModel, 
     initialize: function() { 
      // something 
     } 
    }); 
}); 

我作出初步AJAX調用,讓我的設置,包括API(api.local)的URL。

如何重新路由請求而不將其傳遞給所有模型或硬編碼模型和集合中的網址?

+0

我想我有同樣的問題:http://stackoverflow.com/q/30585563/53468 – tutuca

回答

5

您的網址需要一個字符串或函數。

您的設置Ajax調用,您可以將其存儲在適當的位置, 去獲取,從功能

使用你的例子: 假設你的Ajax調用,保存的網址在myApp.Settings.DefaultURL

define([ 
    'backbone', 
    '../models/communityModel' 
], function(Backbone, CommunityModel){ 
    return Backbone.Collection.extend({ 
     url: function(){ 
      return myApp.Settings.DefaultURL + '/communities'; 
     }, 
     model: CommunityModel, 
     initialize: function() { 
      // something 
     } 
    }); 
}); 

句話 確保此網址以某種方式捕獲或未處理時,它就會被解僱設置你的設置之前,如果您最初的AJAX調用失敗或需要它的時候,你的應用程序可能已經開始編輯沒有它的設置設置,如果在這一點上使用model.save(),你需要處理這個。

+0

謝謝你的回答。我嘗試避免全局myApp對象(我使用RequireJS作爲模塊加載器),所以我無法在我的集合中訪問它。也許一個糟糕的設計決定?我想到了類似於jQuery.ajaxSetup爲骨幹的東西()。 – Riebel

+0

requireJS不限制你在這裏,你只需要以不同的方式組織你的代碼,上面的想法是,一旦模型需要保存,它將請求的URL從某處低谷funtion,它可以是一個全球性的對myApp,它可以是你自己定義的配置模塊。 – Sander

+0

我接受你的答案,因爲它是在Backbone中設置URL的正確方法。我認爲我的問題是比Backbone更有RequireJS相關性。可悲的是,我仍然不知道如何從不同的模塊,讓我的設置並存儲在那裏的變量不使用全局或未做AJAX調用再次每次。 – Riebel

0

通過覆蓋(但不是覆蓋Backbone.sync方法,您可以實現相同的結果,而無需將相同的代碼添加到每個模型/集合。

define(['underscore', 'backbone', 'myApp'], function (_, Backbone, myApp) { 
    'use strict'; 

    // Store the original version of Backbone.sync 
    var backboneSync = Backbone.sync; 

    // Create a new version of Backbone.sync which calls the stored version after a few changes 
    Backbone.sync = function (method, model, options) { 
     /* 
     * Change the `url` property of options to begin with the URL from settings 
     * This works because the options object gets sent as the jQuery ajax options, which 
     * includes the `url` property 
     */ 
     options.url = myApp.Settings.DefaultURL + _.isFunction(model.url) ? model.url() : model.url; 

     // Call the stored original Backbone.sync method with the new url property 
     backboneSync(method, model, options); 
    }; 
}); 

然後你的模型/收藏你可以聲明url像往常一樣(例如url: '/events

不要忘了要求與新Backbone.sync代碼的文件的某處。