【问题标题】:Why is this Backbone model's attribute undefined when I try to get it?为什么当我尝试获取此 Backbone 模型的属性时未定义它?
【发布时间】:2014-04-01 18:52:35
【问题描述】:

我有一个简单的 REST API,它可以为我提供有关 /api/items/:id 的项目的数据,包括 ID 和名称。我正在使用路由器来组织我的 Backbone 视图。 edit 路由实例化了一个 FormEditItem 视图,并将 URL 中的 ID 传递给它。

要从 API 获取模型的数据,表单视图会实例化一个新模型,设置 ID,然后调用模型的 fetch 方法。 (this thread推荐的第二种方法。)

模型声明极其简单:

App.Models.Item = Backbone.Model.extend({

    urlRoot: 'api/items'

});

这是我的表单视图:

App.Views.FormEditItem = Backbone.View.extend({

    template: _.template($('#tpl-formEditItem').html()),

    initialize: function(opts) {
        _.bindAll(this, "render");
        this.modelID = opts.modelID;
        this.parent = opts.parent;
        this.model = new App.Models.Item({id: this.modelID});
        this.model.fetch();
        this.render();
    },

    render: function() {
        console.log('Starting render:', this.model);
        console.log(this.model.get('name'));
        this.parent.$el.append(this.template(this.model.toJSON()));
        return this;
    }

});

在我的表单视图的渲染功能中,我正在注销模型。我可以看到模型的属性。但是在下一行,当我尝试注销 get('name') 的结果时,我得到了 undefined!

发生了什么事?在尝试从数据库中获取模型属性之前,是否需要定义它们?

================================================ ===============================

编辑

按照 Stephen 和 Rida 的建议,解决此问题的方法是为模型的 change 事件添加一个事件侦听器。 fetch 操作需要一些时间从 API 获取数据:我试图在数据到达之前输出数据。所以我的初始化函数应该是:

    initialize: function(opts) {
        _.bindAll(this, "render");
        this.modelID = opts.modelID;
        this.parent = opts.parent;
        this.model = new App.Models.Item({id: this.modelID});
        this.listenTo(this.model, 'change', this.render);
        this.model.fetch();
    }

非常感谢大家!

【问题讨论】:

  • 不,你没有。 get 的源代码很简单:return this.attributes[attr]; 只是检查,但你确定你在问题中复制了正确的代码吗?
  • 会详细解答

标签: javascript rest backbone.js backbone-views backbone-model


【解决方案1】:

问题是您试图在获取完成之前呈现视图。在初始化时,您调用

this.model.fetch()

然后立即调用

this.render()

此时提取不会完成,因此不会有name 属性。

当你在控制台中查看模型时,那是在获取完成之后,所以会有一个name

【讨论】:

  • 非常感谢斯蒂芬,你说得对。 Rida 发布了一个非常相似的答案,但你的答案排在第一位。当我按上述方式更改代码时,视图会呈现数据并且属性会正常注销。
【解决方案2】:

而不是这些行:

this.model.fetch();
this.render();

试着去做

this.listenTo(this.model, 'change', this.render);

【讨论】:

  • 感谢 Rida,Stephen 的回答排在第一位,但我已经给了你一个赞成票。
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2013-01-15
  • 2013-01-18
相关资源
最近更新 更多