骨干模型在模板中未定义。 使用骨干

我的问题:“Uncaught TypeError:无法调用方法'获取'未定义的” - 意思是我没有设法从视图传递我的模型到模板,尽管调用$(@ el).html(@template(pony:@模型))当我渲染。

背景:这是我的第一个骨干应用程序。 我正在使用rails-on-rails gem,接下来是Ryan Bates的railscast:http://railscasts.com/episodes/325-backbone-on-rails-part-2。 backbone-on-rails gem在assets / javascripts文件夹中生成空路由器,集合,模型,视图和模板文件。 我确信它在后面还有其他一些东西,但我不确定是什么。 所有的扩展名都是js.coffee,所以空格很重要!

嫌疑人:由于TypeError发生在正确的模板中,我假设我的路由器和事件绑定都很好。 由于我的视图中的对象是未定义的,因此我认为所有对集合和模型的引用都是可疑的。 因此,我将从有问题的模板开始,然后是我的模型视图,然后是我的集合视图,然后是我的模型类,然后是我的集合类。

我的模型模板:app / assets / javascripts / templates / ponies / pony.jst.eco

<%= @pony.get('name') %>
<img src="<%= pony.get('img_url') %>" alt="shutterfly" height="70" width="70">
<% if @pony.get('selected'): %>
  <span class="selected">SELECTED</span>
<% end %>

我的模型视图:app / assets / javascripts / views / ponies / pony.js.coffee

class Mlp.Views.Pony extends Backbone.View
  template: JST['ponies/pony']
  tagName: 'li'

  events:
    'click': 'showPony'

  initialize: ->
    @model.on('change', @render, this)
    @model.on('select', @selectPony, this)

  showPony: ->
    Backbone.history.navigate("ponies/#{@model.get('id')}", true)

  selectPony: ->
    $('.selected').removeClass('saddled')
    @$('.selected').addClass('saddled')

  render: ->
    $(@el).html(@template(pony: @model))
    this

我的收藏查看:app / assets / javascripts / views / ponies / ponies_index.js.coffee

class Mlp.Views.PoniesIndex extends Backbone.View

  template: JST['ponies/index']

  events:
    'submit #new_pony': 'createPony'
    'submit #new_setting': 'changeSetting'
    'click #pony_up': 'ponyUp'

  initialize: ->
    @collection.on('reset', @render, this)
    @collection.on('add', @appendPony, this)
    @collection.on('change', @render, this)

  render: ->
    $(@el).html(@template())
    @collection.each(@appendPony)
    this

  appendPony: (pony) =>
    view = new Mlp.Views.Pony(model: pony)
    @$('#ponies').append(view.render().el)

  ponyUp: (event) ->
    event.preventDefault()
    @collection.ponyUp

  changeSetting: (event) ->
    event.preventDefault()
    setting = document.getElementById "setting"
    new_src = $('#new_setting_img_url').val()
    console.log setting
    console.log new_src
    setting.src = new_src

  createPony: (event) ->
    event.preventDefault()
    attributes = name: $('#new_pony_name').val()
      img_url: $('#new_pony_img_url'.val())
    @collection.create attributes,
      wait: true
      success: -> $('#new_pony')[0].reset()
      error: @handleError

  handleError: (pony, response) ->
    if response.status == 422
      errors = $.parseJSON(response.responseText).errors
      for attribute, messages of errors
        alert "#{attribute} #{message}" for message in messages

My Model Class:app / assets / javascripts / models / pony.js.coffee

class Mlp.Models.Pony extends Backbone.Model

  select: ->
    @set(selected: true)
    @save()
    @trigger('saddle')

我的收藏类:app / assets / javascripts / collections / ponies.js.coffee

class Mlp.Collections.Ponies extends Backbone.Collection
  url: '/api/ponies'
  model: Mlp.Models.Pony

  ponyUp: ->
    selected = @shuffle()[0]
    selected.select() if selected

我确实有一个种子文件,我使用名称和img_urls创建小马。

在此先感谢您的帮助!

一些调试来缩小问题的范围:

删除模型模板中的变量:Uncaught TypeError:对象#的属性'模板'不是函数

我从模型视图中生成的html是:

Pony.prototype.render = function() {
  $(this.el).html(this.template({
    pony: this.model
  }));
  return this;

我不确定为什么我不能在模型上调用模板,因为我在模型视图的顶部定义了模板。

链接地址: http://www.djcxy.com/p/53367.html

上一篇: backbone model undefined in the template. Using backbone

下一篇: How to set a dynamic property on a model with Backbone.js