2013-07-11 80 views
1

TL的; DR版本:爲骨幹DELETE請求不正確的基礎URL - 使用相對而不是絕對URL

使用建設骨幹PhoneGap的應用程序,並有一個模型叫做客戶端和一個稱爲客戶端集合。使用Tastypie API與單獨的服務器進行通信。當我運行fetch(),URL使用正確的絕對URL(如http://127.0.0.1:8000/api/v1/client/1/的東西,但是當我運行Client.destroy(),它使用的file:///api/v1/client/1/相對URL。我怎樣才能使它使用絕對URL刪除對象?

朗版本:

我建立與Backbone.js的移動應用程序,消耗一個Django/Tastypie API,和我碰到的一些看似奇怪的行爲,我無法弄清楚

我定義了一個位於文件頂部的服務器的基本URL:

// Set the base URL for querying the API 
baseUrl = 'http://127.0.0.1:8000/api/v1/'; 

我有以下的模型和集合:

// Client model 
Client = Backbone.Model.extend({ 

    urlRoot: baseUrl + 'client', 

    // Default values 
    defaults: { 
     id: '', 
     name: '', 
     mobile: '', 
     email: '', 
     notes: '', 
     operator: '', 
     date_client_joined: '', 
     address: '', 
     postcode: '' 
    } 
}); 

// Client collection 
Clients = Backbone.Collection.extend({ 

    // Will hold Client objects 
    model: Client, 

    // Set URL 
    url: baseUrl + 'client/' 
}); 

和個人客戶正在使用下面的視圖列表中的呈現:

// Client list item view 
ClientListItemView = Backbone.View.extend({ 
    tagName: 'li', 

    events: { 
     'click .delete': 'deleteclient' 
    }, 

    render: function() { 
     // Render the client list item template 
     var template = _.template($('#client-list-item-template').html()); 
     this.$el.html(template(this.model.toJSON())); 

     // Return the object 
     return this; 
    }, 

    deleteclient: function() { 
     this.model.destroy(); 
     return false; 
    } 
}); 

現在,應用程序實際上使用jQuery Mobile的每個客戶端在其旁邊有一個刪除按鈕,並帶有一個刪除類,因此每次單擊這些按鈕時都會執行deleteclient功能。我也使用backbone-tastypie來消除Backbone和Tastypie之間的不一致性。

deleteclient函數正在運行,但它將HTTP DELETE請求發送到相對URL爲file:///api/v1/client/1/(因爲這是一個Phonegap應用程序,我只是在本地查看這些文件)。從文檔設置urlRoot手動似乎是要走的路,但這樣做似乎並沒有解決問題。運行fetch()函數來填充集合絕對沒問題 - 它使用正確的絕對URL。

所以,我的問題是如何覆蓋默認行爲,並確保我的HTTP DELETE請求發送到正確的URL?

回答

1

通過查看您的代碼,它應該可以正常工作。在骨幹模型已定義url()函數應該這樣做:

url: function() { 
    var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError(); 
    if (this.isNew()) return base; 
    return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id); 
}, 

你可以使用調試器,看它是否進入這裏面的代碼,什麼是它的結果呢?主要從_.result()調用檢查值...

無論如何,你可以覆蓋你的模型url屬性,而不是通過它在每次調用destroy()

Client = Backbone.Model.extend({ 
    url: function() { return baseUrl + 'client/' + this.id + '/'; } 
    // other code... 
}); 
+0

的'網址()'方法WASN因某種原因而被要求。但是,覆蓋它的作品行,所以我會去。 –

+0

也許你想檢查你使用的骨幹版本......無論如何,一切都正常工作:-) – Tallmaris

+0

它是1.0,通過鮑爾 –

0

我找到了一個解決方案,但我並不完全滿意的:

deleteclient: function() { 
     if (confirm('Are you sure you wish to delete this client?')) { 
      // Destroy the model 
      this.model.destroy({ 
       url: baseUrl + 'client/' + this.model.get('id') + '/' 
      }); 

      // Remove the view 
      this.remove(); 
     }  
    } 

基本上,如果我明確地通過URL來破壞(),它做的伎倆。有些煩人的是,我找不到更乾的方式來做到這一點,所以我願意接受任何其他做同樣事情的方法。