1

TL;DR バージョン:

Backbone を使用して Phonegap アプリを構築し、Client というモデルと Clients というコレクションを作成します。Tastypie API を使用して別のサーバーと通信します。を実行するfetch()と、URL は正しい絶対 URL を使用します( .http://127.0.0.1:8000/api/v1/client/1/Client.destroy()file:///api/v1/client/1/

長いバージョン:

Django/Tastypie API を使用する Backbone.js を使用してモバイル アプリを構築していますが、理解できない一見奇妙な動作に遭遇しました。

ファイルの先頭でサーバーのベース 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 を使用しており、各クライアントの横に delete クラスの [削除] ボタンがあるため、これらのボタンの 1 つがクリックされるたびに deleteclient 関数が実行されます。また、backbone-tastypie を使用して、Backbone と Tastypie の間の矛盾を解決しています。

deleteclient 関数は実行されていますが、HTTP DELETE 要求を の相対 URL に送信しますfile:///api/v1/client/1/(これは Phonegap アプリであるため、ローカルでファイルを表示しているだけです)。ドキュメント設定 urlRoot から手動で行く方法のように見えますが、そうしても問題は解決しないようです。ただし、fetch() 関数を実行してコレクションにデータを入力すると、まったく問題なく動作します。正しい絶対 URL が使用されます。

それで、私の質問は、デフォルトの動作をオーバーライドして、HTTP DELETE リクエストが正しい URL に送信されるようにするにはどうすればよいですか?

4

2 に答える 2

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...
});
于 2013-07-11T15:07:49.177 に答える