【问题标题】:Trouble with Creating Backbone Models & Collections创建主干模型和集合的问题
【发布时间】:2011-06-01 13:26:01
【问题描述】:

我真的,真的 正在尝试学习 Backbone,而且我需要花很多力气(来自 Rails)。所以我正在尝试编写一个简单的应用程序,它只从 Sinatra 后端获取一个集合。现在,路由/schools 返回一个类似于["One School", "Two School"] 的JSON 对象。很简单。不幸的是,以下总是为我返回ReferenceError

学校模式

(function() {
   window.school = Backbone.Model.extend({});
}).call(this);

学校收藏

(function() {
  window.schools = Backbone.Collection.extend({
    url: '/schools',
    model: window.school
  });
}).call(this);

控制台

var f = new window.school({name: "temp"});

未定义

f.id();

参考错误

这样简单的交互是行不通的。此外,调用 window.schools.fetch() 会导致 UndefinedObject 错误。不知道我到底哪里出错了,但似乎没有任何效果。任何帮助都会很棒!

编辑:集合和模型写在一个闭包中,因为它是从 Coffeescript 编译而来的。

【问题讨论】:

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


    【解决方案1】:

    有两种获取模型 id 的方法:model.idmodel.get('id')model.id() 没有定义,所以它会给你一个错误。见http://documentcloud.github.com/backbone/#Model-id

    【讨论】:

    • 这些都不起作用。 new window.school.save() 也没有。至于不工作,我的意思是我得到相同的 ReferenceError here's an image
    • 看看link,这是 Chrome 在 Javascript 控制台中显示的内容。您的浏览器对此有何反应?
    【解决方案2】:

    我从未使用过 Coffeescript,但是,我的骨干网越来越好……所以我会试一试。这里可能会发生几件事。 Backbone.js 依赖于 jquery 或 zepto 和 underscore.js,它们使用 '$' 和 '_' 作为它们的特殊变量。这可能会导致咖啡脚本出现问题。

    您可能希望运行一个示例主干应用程序,而不是使用 coffeescript 进行尝试。

    就上面的代码而言,我认为我发现了几件事:

    当您使用数据实例化模型时,它没有“id”(因为它没有按照上面提到的文档与服务器同步)。如果数据 IS 来自服务器,则在 init 哈希中包含一个 id: id,model.id 将返回一个 id。如果您需要一个尚未同步的模型的唯一标识符,您可以使用“cid”属性(这是一个本地的唯一标识符)。

    请记住,当您“扩展”时,您实际上是在构建一个类,因此,除非您已实例化集合的实例,否则“获取”将不起作用。你需要这样做:

    var collection = new Collection();
    collection.fetch();
    

    'save()' 不起作用的原因是您没有为奇异模型定义 url。您已经在集合中定义了它,但没有在模型中定义它,因此如果您尝试实例化非集合模型,它不会引用 restful 服务。

    希望有帮助!

    【讨论】:

      【解决方案3】:

      f 没有 id,因为它尚未保存到服务器。 Backbone 对每个模型都有两个唯一标识符:一个是在模型位于客户端的那一刻创建的 clientid。这不会发送到服务器。当一个模型被保存到服务器时,Backbone 期望它返回 JSON 编码的保存模型,它当然有一个 id 属性(一旦它被保存到数据库中就会获取)并更新本地模型以匹配发送的模型数据通过服务器,从而在客户端模型实例上创建 id 属性。如果您的服务器端模型与客户端模型不完全对应,那么您可以覆盖 Backbone.sync 和 Backbone.Model.parse 函数以满足您的要求。

      window.schools.fetch() 失败,因为 window.schools 是 Collection 类而不是实例。以在获取之前创建模型实例的方式创建集合实例,并确保正确配置 rails 资源学校以发送学校模型实例的 json 编码列表。 此外,如果您要使用 Backbone.sync 的开箱即用实现,则必须设置: ActiveRecord::Base.include_root_in_json = false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多