Backbone:在传递模型时,视图的模型是未定义的

时间:2014-03-01 18:01:25

标签: javascript backbone.js

这是我简单的Backbone应用程序的全部内容。当我实例化一个新视图时,我将它传递给模型,但是当视图在模型上调用attributes时,它表示模型未定义:

class App.Recipe extends Backbone.Model

class App.RecipeList extends Backbone.Collection
  url: '/users/4/recipes'
  model: App.Recipe

@recipeList = new App.RecipeList
@recipeList.fetch()

class App.RecipeView extends Backbone.View
  template: _.template(@model.attributes)
  render: ->
    @$el.html(@template)
    @

@recipeView = new App.RecipeView(model: recipeList.models[0])

$ ->
  $('#featured_recipes').html(window.recipeView.render())

在控制台中,recipeList.models[0]返回一个确实具有attributes属性的JSON对象。因此,当我实例化视图并将其传递给模型时,为什么我会得到Uncaught TypeError: Cannot read property 'attributes' of undefined

我的猜测是,在我传入模型之前,@model正在运行时进行评估。有没有办法推迟呢?或者我错了吗?

我还在视图的初始化函数中尝试了_.bindAll @。没有骰子。

PS - 我显然是一个菜鸟,所以如果你看到其他反模式或我将要遇到的事情,请随时提及。

修改

我已经尝试了here概述的答案,在我的initialize方法中添加内联模板,如下所示:

class @App.RecipeView extends Backbone.View
  tagName: 'li'
  initialize: ->
    _.bindAll @, 'render'
    template = _.template $('#featured_recipes').html()
  render: ->
    @$el.html @model.toJSON()
    @

但后来我得到了Cannot call method 'replace' of undefined,我知道这是来自下划线调用模板,而不是在DOM中的东西,而且这种情况正在发生,因为这会在我的DOM渲染之前被调用。有什么想法吗?

编辑2

现在我已将整个应用程序移动到haml布局的页脚中,以便$(#featured-_recipes') div位于DOM中。然后我将视图更改为:

class @App.RecipeView extends Backbone.View
  tagName: 'li'
  initialize: ->
    _.bindAll @, 'render'
  @template: _.template $('#featured_recipes').html()
  render: ->
    @$el.html @template(@model.toJSON())
    @

但我仍然得到Cannot call method 'replace' of undefined

1 个答案:

答案 0 :(得分:-1)

尝试以下方法。我在你的View中添加了一个初始化方法,我使用了Backbone的Collection get方法来获取你的食谱。

class App.RecipeView extends Backbone.View
  initialize: (options) ->
    @model = options.recipe 

  template: _.template(@model.attributes)
  render: ->
    @$el.html(@template)
    @


@view = new App.RecipeView
          recipe: recipeList.get(0)