ChatGPT解决这个技术问题 Extra ChatGPT

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

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

恕我直言,它属于该系列。像 Collection#fetchOne(id, callback) 这样的东西。

H
Hernan S.

尝试在模型中指定 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
@SimplGy 之所以有效,是因为 model.id 本质上是 model.attributes.id 的同义词。如果您调用 model.set('id'),Backbone 会将 model.id 设置为您指定的任何内容。 model.id 是在创建特定于模型的 URL 时使用的。
A
Andrew De Andrade

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

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


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

我个人建议,遵循 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 语句


显然这行不通。在模型(或集合)中调用 fetch 时甚至不调用服务器
这看起来不错,但是当我们真的不需要集合时,集合行看起来很尴尬。
我无法让它工作:this.model.get('field')。看起来模型是创建子对象
this.model.bind("change", this.render, this) 对我来说效果很好
@UlysseBN 是的(是 2011 年),您可以添加 var 语句、{}() 中用于传递的对象和可选的 ; 广告在行尾
A
Ankit Garg
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();

因此,您在

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

你得到了 JSON 响应。

享受!


这与@Hernan 的解决方案相同
4
4m1r

...如果您不希望模型 urlRoot 上的尾部斜杠,请执行此操作:

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

s
ssobczak

您可能应该通过集合访问对象并将其始终保存在集合中。这是如何做到的:

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});

var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()

你不知道。也许他只需要一个时钟。假设我想向客户展示一个用户记录的单个模型?他也应该有权访问所有用户的集合吗?有时,人们在尝试将用例保密时只需要一些建议。只要回答。
A
Araell

我想使用 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"
    }
});