4

現在、Node.js、Express.js、Backbone.js、および MongoDB を使用してアプリケーションを開発しています。モデルが標準の ID パラメータ以上のものを使用してサーバーをフェッチ (GET) する必要がある状況をどのように処理するかについて、設計上の問題に直面しています。

次の簡単な例を考えてみましょう:

Book = Backbone.Model.extend({

    urlRoot : "/io/books",

    defaults : {
    author : 'No Name'  
    }

});

var myBook = new Book();
myBook.set('id','87');
myBook.fetch({success: ioSuccess, error: ioFail});

サーバー側では、fetch は URL /io/books/87 を呼び出します。ここで、'87' は request.params 列挙子の一部になります。

では、ID が DB から単一の本のモデルを取得するのに十分でない場合はどうなるでしょうか? DB から本のモデルを取得するのに ID と出版社 ID が必要な場合はどうすればよいでしょうか?

最初の解決策は、URL が /io/books/:ID/:PublisherID になるように params を拡張することです。

しかし、バックボーンがこのデザインにどのように適合するか誰か教えてもらえますか? 私は成功せずに次のことを試しました:

var myBook = new Book();
myBook.set('id','87');
myBook.set('publisherid','34');
myBook.fetch({success: ioSuccess, error: ioFail});

また、私の問題を克服するために、フェッチ関数のデータ部分に追加のキーを (成功して) 追加しました。

myBook.fetch({'data': {'publisherid':'34'}, {success: ioSuccess, error: ioFail});

しかし、サーバー側では、必要なすべてのキーを取得するためにマージする必要がある 2 つの列挙子 (request.params と request.query) になるため、このソリューションは洗練されていません。

ありがとう、EBL

4

1 に答える 1

3

モデルにカスタムurlメソッドを提供し、目的のエンドポイントに合わせて調整できます。

たとえば、 /io/books/:ID/:PublisherIDフラグメントに一致させるには、クラスを次のように定義できます。

var Book = Backbone.Model.extend({
    urlRoot : "/io/books",

    // see http://backbonejs.org/docs/backbone.html#section-65
    // for the source code
    url: function() {
      var base = _.result(this, 'urlRoot');
      if (this.isNew()) return base;

      return base + 
          '/' + encodeURIComponent(this.id) + 
          '/' + encodeURIComponent(this.get('publisherid'));
    },

    defaults : {
        author : 'No Name'  
    }
});

var myBook = new Book();
myBook.set('id', '87');
myBook.set('publisherid', '34');
myBook.fetch();

そしてhttp://jsfiddle.net/nikoshr/8zS5a/で遊ぶフィドル

于 2013-07-22T16:14:55.023 に答える