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

时间:2011-02-23 21:06:33

标签: javascript model-view-controller rest backbone.js

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

7 个答案:

答案 0 :(得分:137)

尝试在模型中指定urlRoot

来自文档:

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

答案 1 :(得分:26)

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

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,但即使您尚未使用它也应该有效。

答案 2 :(得分:26)

我个人建议,按照Model#url method documentation

model = new Model(id: 1)
view = new View(model: model) 
collection = new Collection([model])
model.fetch()

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

url: "/models"

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

this.model.bind("change", this.render)

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

"/models/1"

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

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

答案 3 :(得分:12)

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

因此,您在

上发出Ajax请求
URL http://[domainName]/person/details/id 

然后你回复了JSON。

Enjoiiii !!!

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您可能应该通过集合访问该对象并始终将其保留在集合中。这是怎么做的:

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

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

答案 6 :(得分:0)

我想使用RESTful网址,但我无法理解为什么'postId'无法添加到基本网址。

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());

然后我知道只有在我将'idAttribute'设置为Model中的'postId'之后我才能获得正确的URL。 像这样:

var PostModel = Backbone.Model.extend({
    idAttribute: 'postId',
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});