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

IT技术 javascript model-view-controller rest backbone.js
2021-03-05 12:21:00

Clock在 Backbone 中有一个模型:

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 支持的时钟?

6个回答

尝试在模型中指定urlRoot

从文档:

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
这很好,但有时您不想重新实例化模型。如果要针对同一模型获取特定项目,则可以执行无提示设置:currentBook.set('id', 13423, {silent:true})这也有效,但我不确定为什么:currentBook.id = 13423
2021-04-21 12:21:00
@SimplGy 之所以有效,model.id因为本质上与model.attributes.id. 如果您调用model.set('id'),Backbone 将设置model.id为您指定的任何内容。并且model.id是创建特定于模型的 URL 时使用的内容。
2021-05-20 12:21:00

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

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,但即使您还没有,它也应该可以工作。

这是工作链接(他们移动了文档!哇,5 年过去了, 天哪): backbonejs.org/#Model-url - @StevenDevijver 是正确的
2021-04-23 12:21:00
@makevoid 您的我无法使您在咖啡脚本中提供的示例或文档中的示例工作,安德鲁示例有效,您能否提供带有 foo.url() 的示例,它总是告诉我没有函数 url。
2021-04-27 12:21:00
@makevoid 似乎您所指的方法仅在模型已在集合中创建时才有效。注意 中的集合[collection.url]/[id]
2021-05-10 12:21:00
@makevoid 你能提供一个工作链接吗?不幸的是,这个暂时坏了
2021-05-12 12:21:00
有一种方法可以避免这种情况,如 Backbone Model 文档documentcloud.github.com/backbone/#Model-url 中所述
2021-05-18 12:21:00

我个人推荐,遵循Model#url 方法文档

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 语句

我无法让它工作:this.model.get('field')。看起来模型是创建子对象
2021-04-28 12:21:00
@UlysseBN 是的(是 2011 年),您可以{}()'s 中添加 var 语句,用于传递的对象,可选;ad在行
2021-05-03 12:21:00
显然这行不通。在模型(或集合)中调用 fetch 时甚至不要调用服务器
2021-05-09 12:21:00
this.model.bind("change", this.render, this) 对我来说效果很好
2021-05-10 12:21:00
这看起来不错,但在我们并不真正需要集合的情况下,集合线看起来很尴尬。
2021-05-16 12:21:00
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();

因此,您在

URL http://[domainName]/person/details/id 

并且您返回了 JSON 响应。

享受吧!!!

这是与@Hernan 相同的解决方案
2021-05-06 12:21:00

...如果您不想在模型 urlRoot 上使用尾部斜杠,请执行此操作:

    url : function() {                        
        return this.urlRoot + this.id;
    },