2

编辑了更多上下文。当 $CONSTRUCTOR = pass_in 时,它会在 Firefox 和 Chrome 中抛出“passed_in is not a constructor”。当 $CONSTRUCTOR = not_passed_in 时,它不

  initialize: (options) ->
    @collection.bind 'all', @render
    $('.search_box').parent('form').submit (event) => 
      @loading()
      event.preventDefault()
      query = $(event.target).find('.search_box').val()
      window.app.navigate('?query=' + query, trigger: true)
    passed_in = PaginationView
    @render(passed_in)

  render: (passed_in)=> 
    if @collection.isEmpty() && @collection.query
      @$el.html(JST['users/no_results'](query: @collection.query))
    else if @collection.isEmpty() # Not loaded yet
      @$el.html("<div class='loading'></div>")
    else
      html = JST['users/user_list'](@viewData())
      @$el.html(html)
      for user in @collection.models
        html = new UserListItemView(model: user).render().el
        @$('tbody.users').append(html)

      not_passed_in = PaginationView
      new $CONSTRUCTOR(
        type: "user"
        el: @$('.paginate')
        model: @collection
        data: {}
        onError: @onError
      ).bind('change', @loading)

这是 CoffeeScript 的已知(错误|功能)吗?还是我做错了什么?

(这些在 Backbone.coffee 视图中。我怀疑这是否相关)

4

1 回答 1

0

为了简化问题:

MyView = Backbone.View.extend

    initialize: (options) ->
        passed_in = PaginationView
        @render(passed_in)

    render: (passed_in) => 
          not_passed_in = PaginationView
          new passed_in(
            type: "user"
            el: @$('.paginate')
            model: @collection
            data: {}
            onError: @onError
          ).bind('change', @loading)

1) 通常@render 的最后一行是@this而不是另一个视图。

2)最可能的问题是有一些其他代码@render()在没有参数的情况下调用。建议您提供一个默认参数,例如:

render: (passed_in=PaginationView) =>

3)如果PaginationView创建一个MyView,你可能会得到一个堆栈溢出错误:

  • MyView.initialize 调用渲染,
  • 调用 PaginationView.initialize
  • 调用 MyView.initialize
  • .. 环形。

4) JSON.stringifypassed_in在任何时候都会被调用吗?如果是这样,它会将函数转换为undefined

passed_in = JSON.stringify(passed_in)
undefined == passed_in
# always true if passed_in is a function
于 2012-08-23T07:57:30.193 回答