如何在 Backbone 中获取单个模型?
Posted
技术标签:
【中文标题】如何在 Backbone 中获取单个模型?【英文标题】:How do I fetch a single model in Backbone? 【发布时间】:2011-07-03 02:20:54 【问题描述】:我在 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)。 【参考方案1】:尝试在模型中指定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 时使用的。【参考方案2】:
您的第二种方法是我使用的方法。尝试将以下内容添加到您的时钟模型中:
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() 的示例,它总是告诉我说没有功能网址。 @makevoid 似乎您所指的方法仅在模型已在集合中创建时才有效。请注意[collection.url]/[id]
中的集合。
@makevoid 你能提供一个工作链接吗?不幸的是,这个现在坏了
这里是工作链接(他们移动了文档!哇,5 年过去了,天哪):backbonejs.org/#Model-url - @StevenDevijver 是正确的【参考方案3】:
我个人推荐,关注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 语句,
用于传递的对象,可选的 ;
广告在行尾跨度>
【参考方案4】:
var Person = Backbone.Model.extend(urlRoot : '/person/details');
var myName = new Person(id: "12345");
myName.fetch();
因此,您在
上发出 Ajax 请求URL http://[domainName]/person/details/id
你得到了 JSON 响应。
享受吧!
【讨论】:
这与@Hernan 的解决方案相同【参考方案5】:...如果您不想在模型 urlRoot 上使用尾部斜杠,请执行此操作:
url : function()
return this.urlRoot + this.id;
,
【讨论】:
【参考方案6】:您可能应该通过集合访问对象并将其始终保存在集合中。这是怎么做的:
var AllClocks = Backbone.Collection.extend(
model: Clock,
url: '/clocks/'
);
var allClocks = new AllClocks();
my_clock = allClocks.add(id: 123);
my_clock.fetch()
【讨论】:
你不知道。也许他只需要一个时钟。假设我想向客户展示一个用户记录的单个模型?他也应该有权访问所有用户的集合吗?有时,人们在尝试将用例保密时只需要一些建议。只要回答。【参考方案7】:我想使用 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"
);
【讨论】:
以上是关于如何在 Backbone 中获取单个模型?的主要内容,如果未能解决你的问题,请参考以下文章
如何从localStorage集合中删除Backbone模型
如何使用模型/集合获取 4 个 JSON (API) 响应到主干.js 中的一个视图