1

嗨,我从服务器获取数据的基本模型运行良好。我想实现一个搜索功能。当用户输入任何数据时,请求会转到浏览器并返回所需的模型。

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

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

在哪里

  name = "search/"+dynamic_data;

当我传递时正在形成的请求 URL --> 变量 dynamic_data 中的“生命”

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

请求我想要的 URL

 http://host/path/search/life

我如何编码/转义我的字符串以达到预期的结果。我试过 escape()、encodeURI()、encodeURIComponents

  1. 解决此问题的一种解决方法是使用 urlRoot 作为 /books/search 再创建一个模型并仅传递 name 。我不认为这是正确的。我应该使用这个吗?
4

3 回答 3

1

根据你的附加精确度,生活实际上是一个书名......

看起来 Backbone 更好地与 RESTful API 集成。在 REST 中,您的 url 不应包含动词,并且要搜索书籍,您将执行GET /books/?name=life.

在这种情况下,您只需要定义一个Backbone.Collectionlike:

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

取书:

var books = new BooksCollection();

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

如果您真的希望您的搜索操作以 target 为目标/search/:name,则必须检查Backbone.Collection 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 回答
0

decodeURIComponent() 将解码http://host/path/search%2Flifehttp://host/path/search/life.

于 2013-03-31T15:56:33.123 回答