2012-09-21 131 views
2

在集合上調用create()時,是否可以更改加載的URL?我這樣做對型號爲這裏要注意: Backbone.js Model different url for create and update?收集骨幹覆蓋網址創建

下面是我收集的代碼示例:

var GroupsCollection = Backbone.Collection.extend({ 
    model:Group, 
    url:"/api/groups/get_all/", 
    parse:function(res){      
     return res.groups; 
    }, 

    sync: function(method, model, options) { 
     var methodUrl = { 
      'add': '/api/group/create/' 
     }; 
     if (methodUrl && methodUrl[method.toLowerCase()]) { 
      options = options || {}; 
      options.url = methodUrl[method.toLowerCase()]; 
     } 
     Backbone.sync(method, model, options); 
    }  
}); 

我從我的模型類(集團)應付的同步功能。我在methodUrl中使用'add'鍵,因爲Backbone文檔說調用create()時觸發了「add」事件。我嘗試過「創建」而不是「添加」(不起作用)。

調用創建()始終只是加載URL: 「/ API /組/ get_all」

幫助?打開圍繞這些東西的最佳實踐的任何想法。謝謝!

+0

你是否覆蓋了組模型的創建網址? –

回答

0

我想說,如果你可以讓其餘的「約定」變成可以更容易閱讀,並讓Backbone處理你的URL,那麼它就是默認的。 (在大多數服務器上切換request.method非常容易)。

無論如何,你可以簡單地改變URL在創建時:

groupCollection.create(
    {attr1: 'val1', etc: '...'}, 
    {url: '/api/group/create/'} 
).save() 
+0

我認爲這是我要去的。我想的另一個選擇是保持URL非常通用(/ api/group /),並將action(「create」)作爲參數傳遞。無論哪種方式,謝謝你的回覆! – Dwight

1

閱讀backbone.js源代碼,你會發現:Collection.sync只能由Collection.fetch調用。所以你的覆蓋不起作用。您應該在Group模型中覆蓋Model.sync

+1

有什麼方法可以改變調用Collection.create()時被調用的url嗎? – Dwight

+0

覆蓋'Group.sync'方法。或者對於全局,請覆蓋'Backbone.sync'。 – risent

1

我強烈建議您與原來的覆蓋Backbone.sync的方式堅持。這聽起來像你沒有工作的原因是因爲你已經在集合中設置了一次url,並且在模型中設置了一次。您只需要 - 也應該 - 設置的網址的收藏。如果這不是它不起作用的原因,那肯定不起作用,因爲骨幹的「加法」方法被稱爲create。從來源:

var methodMap = { 
    'create': 'POST', 
    'update': 'PUT', 
    'delete': 'DELETE', 
    'read': 'GET' 
}; 

一些簡化您同步覆蓋:

sync: function(method, model, options) { 
    options || (options = {}); 

    if (method === 'create') { 
     options.url = '/api/group/create/'; 
    } 

    Backbone.sync(method, model, options); 
} 

以上都不是真正解決你的問題的根源,但:您的服務器應該是基於HTTP請求路由動詞。例如,如果你是POST ing,你的服務器應該路由到一個方法,它接收傳入的參數並從它們中創建一個新的對象。這將允許您在Backbone集合上設置一個通用的/api/groups/網址,而不管您是在創建,閱讀,更新還是銷燬。