我在 Backbone 中有一个 Clock
模型:
var Clock = Backbone.Model.extend({});
我正在尝试获取具有来自 /clocks/123
的最新信息的实例。我尝试过的一些事情:
“类”级方法
Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'
创建一个实例,然后在其上调用 fetch:
c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified
一个集合
我尝试创建一个 AllClocks
集合资源(即使页面上没有这样的东西):
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/
如何只获得一个 API 支持的时钟?
尝试在模型中指定 urlRoot:
从文档:
var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
您的第二种方法是我使用的方法。尝试将以下内容添加到您的时钟模型中:
url : function() {
var base = 'clocks';
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},
这种方法假设您已经在 URL 中实现了带有 hashbang 的控制器,例如 http://www.mydomain.com/#clocks/123 ,但即使您还没有,它也应该可以工作。
[collection.url]/[id]
中的集合。
我个人建议,遵循 Model#url method documentation
model = new Model(id: 1)
view = new View(model: model)
collection = new Collection([model])
model.fetch()
在您的收藏中记得添加收藏网址:
url: "/models"
并在您的视图的初始化函数中执行:
this.model.bind("change", this.render)
这样,骨干网将使用此 url 执行 ajax 请求:
"/models/1"
您的模型将被更新并呈现视图,而无需修改 Collection#url 或 Model#urlRoot
注意:对不起,这个例子是在咖啡脚本中出现的,但是你可以很容易地将它翻译成 js 添加 var 语句
{}
在 ()
中用于传递的对象和可选的 ;
广告在行尾
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();
因此,您在
URL http://[domainName]/person/details/id
你得到了 JSON 响应。
享受!
...如果您不希望模型 urlRoot 上的尾部斜杠,请执行此操作:
url : function() {
return this.urlRoot + this.id;
},
您可能应该通过集合访问对象并将其始终保存在集合中。这是如何做到的:
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()
我想使用 RESTful url,但我不明白为什么不能将“postId”添加到基本 url。
var PostModel = Backbone.Model.extend({
urlRoot: 'getBlogPost',
defaults: {
postTitle: "defaultTitle",
postTime: "1970-01-01",
postContent: "defaultContent",
postAuthor: "anonymous"
}
});
var post = new PostModel({
postId: 1
});
alert(post.url());
然后我知道只有在 Model 中将 'idAttribute' 设置为 'postId' 后才能获得正确的 url。像这样:
var PostModel = Backbone.Model.extend({
idAttribute: 'postId',
urlRoot: 'getBlogPost',
defaults: {
postTitle: "defaultTitle",
postTime: "1970-01-01",
postContent: "defaultContent",
postAuthor: "anonymous"
}
});
不定期副业成功案例分享
currentBook.set('id', 13423, {silent:true})
。这也有效,但我不知道为什么:currentBook.id = 13423
model.id
本质上是model.attributes.id
的同义词。如果您调用model.set('id')
,Backbone 会将model.id
设置为您指定的任何内容。model.id
是在创建特定于模型的 URL 时使用的。