如何在Backbone中获取单个模型?

Jam*_*sen 93 javascript rest model-view-controller backbone.js

Clock在Backbone中有一个模型:

var Clock = Backbone.Model.extend({});
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取具有最新信息的实例/clocks/123.我试过的一些事情:

一个"类"级方法

Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'
Run Code Online (Sandbox Code Playgroud)

创建一个实例,然后调用fetch它:

c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified
Run Code Online (Sandbox Code Playgroud)

一个集合

我尝试创建一个AllClocks集合资源(即使我在页面上没有使用这样的东西):

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/
Run Code Online (Sandbox Code Playgroud)

我如何才能获得一个支持API的时钟?

Her*_* S. 137

尝试在模型中指定urlRoot:

来自文档:

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但有时您不想重新实现模型.如果要针对同一模型获取特定项,可以执行静默集:`currentBook.set('id',13423,{silent:true})`.这也有效,但我不确定原因:`currentBook.id = 13423` (2认同)

And*_*ade 26

你的第二种方法是我用过的方法.尝试将以下内容添加到您的时钟模型中:

url : function() {
  var base = 'clocks';
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},
Run Code Online (Sandbox Code Playgroud)

这种方法假设您已经在URL中实现了带有hashbang的控制器,如http://www.mydomain.com/#clocks/123,但即使您还没有,它也应该可以工作.

  • 有一种方法可以避免这种情况,如Backbone Model文档中所述http://documentcloud.github.com/backbone/#Model-url (3认同)

mak*_*oid 26

我个人建议,遵循Model#url方法文档

model = new Model(id: 1)
view = new View(model: model) 
collection = new Collection([model])
model.fetch()
Run Code Online (Sandbox Code Playgroud)

在你的收藏中记得添加收集网址:

url: "/models"
Run Code Online (Sandbox Code Playgroud)

并在View的初始化函数中执行:

this.model.bind("change", this.render)
Run Code Online (Sandbox Code Playgroud)

这样,骨干网将使用此url执行ajax请求:

"/models/1"
Run Code Online (Sandbox Code Playgroud)

您的模型将被更新并呈现视图,而无需修改Collection#url或Model#urlRoot

注意:抱歉这个例子出现在咖啡脚本中,但您可以轻松地将其转换为js添加var语句


小智 12

var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();
Run Code Online (Sandbox Code Playgroud)

因此,您可以在上面发出Ajax请求

URL http://[domainName]/person/details/id 
Run Code Online (Sandbox Code Playgroud)

并且你有JSON回复.

Enjoiiii !!!

  • 这和@Hernan是一样的解决方案 (2认同)