8

Backbone.js 通过 ID 获取模型的默认 RESTful 方法简单直接。但是,我似乎找不到任何通过不同属性获取模型的示例。如何通过不同的属性获取 Backbone.js 模型?

var Widget = Backbone.Model.extend({
    urlRoot: '/widgets',
    fetchByName: function(){ ... }
});
var foowidget = new Widget({name: 'Foo'});
foowidget.fetchByName();
4

5 回答 5

14

您可以尝试在您的base model定义上或在调用 fetch 时按需执行类似的操作。

model.fetch({ data: $.param({ someParam: 12345}) });

在你的情况下,沿着线。

var Widget = Backbone.Model.extend({
    initialize: function(options) {
        this.name = options.name;        
    },
    urlRoot: '/widgets',
    fetchByName: function(){ 
        this.fetch({ data: $.param({ name: this.name }) }) 
    }
});

var foowidget = new Widget({name: 'Foo'});
foowidget.fetchByName();
于 2013-01-28T07:38:58.100 回答
3

一种方法是覆盖 Backbone.sync() 方法,无论是针对所有类还是仅针对您的类。但是,大概您的目标是仅覆盖单个模型的 fetch 。一种方法是直接调用 jQuery.ajax(...),并在成功时获取响应并设置它,例如

fetchByName: function() {
   var self = this;

    $.ajax({
      url: self.urlRoot+ "?name="+this.get('name'),
      type: 'GET',
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function(data) {
          self.set(data);
      }
    });


}
于 2013-01-28T04:56:07.627 回答
3

如果模型是集合的一部分,您可以使用 where() 拉出符合某些条件的模型。

请参阅http://backbonejs.org/#Collection-where

于 2013-01-28T04:59:25.070 回答
1

我真的很喜欢“user645715”建议的方法。我已将代码调整为更加通用。如果您将其添加到主干模型,它将允许您通过一个或多个属性搜索服务器,并且应该作为fetch.

fetchByAttributes: function(attributes, callbacks) {

    var queryString = [];
    for(var a in attributes){
        queryString.push( encodeURIComponent(a)+'='+encodeURIComponent(attributes[a]) );
    }
    queryString = '?'+queryString.join('&');

    var self = this;

    $.ajax({
        url: this.urlRoot+queryString,
        type: 'GET',
        dataType: "json",
        success: function(data) {
            self.set(data);
            callbacks.success();
        },
        error: function(data){
            callbacks.error();
        }
    });
}

它可以这样使用:

var page = new Page();
page.fetchByAttributes({slug:slug}, {
    success: function(){
        console.log('fetched something');
    },
    error: function(){
        console.log('nothing found');
    }
});
于 2014-01-28T22:00:52.190 回答
0

这很简单 model.fetch 在某些方面与 $.ajax 相同

model = Backbone.Model.extend({
    urlRoot: "/root/"
});

var Model = new model();

Model.fetch({
    beforeSend: function () {
        console.log("before");
    },
    data: {
        param1: "param1",
        param2: "param2"
    },
    success: function () {
        console.log("success");
    },
    error: function () {
        console.log("failure");
    }
});
于 2014-02-11T08:07:35.220 回答