1

こんにちは、サーバーからデータを取得する基本モデルは完璧に機能しています。検索機能を実装したい。ユーザーがデータを入力すると、リクエストがブラウザに送られ、目的のモデルが返されます。

var Book = Backbone.Model.extend({
  urlRoot: '/books'
});

  render: function(options) {
  books = new Book({id:options.name});
  books.fetch();
   }

どこ

  name = "search/"+dynamic_data;

変数 dynamic_data で --> 'life' を渡すと形成されるリクエスト URL

  http://host/path/search%2Flife

欲しいリクエストURL

 http://host/path/search/life

文字列をエンコード/エスケープして、目的の結果を得るにはどうすればよいですか。私はエスケープ()、encodeURI()、encodeURIComponentsを試しました

  1. これを解決するための回避策は、urlRoot を /books/search としてもう 1 つのモデルを作成し、 name だけを渡すことです。これは正しくないと思います。これを使うべきですか?
4

3 に答える 3

1

人生は実際には本の名前であると述べているあなたの追加の精度によると...

Backbone は RESTful API との統合が改善されているようです。REST では、URL に動詞を含めないでください。書籍を検索するには、GET /books/?name=life.

その場合、次のBackbone.Collectionように定義するだけで済みます。

var BooksCollection = Backbone.Collection.extend({
    model: Book,
    url: '/books'
});

本を取得するには:

var books = new BooksCollection();

books.fetch({data : {name: 'life'}}); //GET /books/?name=life

本当に検索操作を target にしたい場合は、 Backbone.Collection/search/:name APIを確認する必要がありますが、 http://backbonejs.org/#Syncを見たいと思うでしょう。

syncコレクションのメソッドを次のようにオーバーライドできます。

Backbone.Collection.extend({
    ...
    sync: function (method, model, options) {

        //for read operations, call the search url
        if (method === 'read') {
            options.url = '/search/' + options.data.name;
            delete options.data.name;
        }

        //call the default sync implementation
        return Backbone.Collection.prototype.sync.apply(this, arguments);
    }
});

この場合、呼び出しbooks.fetch({data : {name: 'life'}});の結果はGET /books/life.

これは例を示すフィドルです。

于 2013-03-31T14:35:43.710 に答える
0

これはうまくいくでしょう:

books = new Book({id:options.name}, {url: options.name));

于 2013-03-31T14:07:26.567 に答える