Backbone.js的默认方式,通过ID获取模型的RESTful方法简单直接。但是,我似乎找不到任何通过不同属性获取模型的示例。如何通过不同的属性获取Backbone.js模型?
var Widget = Backbone.Model.extend({
urlRoot: '/widgets',
fetchByName: function(){ ... }
});
var foowidget = new Widget({name: 'Foo'});
foowidget.fetchByName();
答案 0 :(得分: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();
答案 1 :(得分:3)
一种方法是覆盖Backbone.sync()方法,适用于所有类或仅适用于您的类。但是,大概你的目标是覆盖单个模型的获取。一种方法是直接调用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);
}
});
}
答案 2 :(得分:3)
如果模型是集合的一部分,您可以使用where()来提取符合某些条件的模型。
答案 3 :(得分:1)
我非常喜欢'user645715'建议的方法。我已经调整了代码以使其更加通用。如果将其添加到Backbone模型,它将允许您通过一个或多个属性搜索服务器,并且应该作为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');
}
});
答案 4 :(得分: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");
}
});