这是我简单的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 @
。没有骰子。
我已经尝试了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渲染之前被调用。有什么想法吗?
现在我已将整个应用程序移动到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
。
答案 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)