【问题标题】:render view in backbone.js + rails在backbone.js + rails中渲染视图
【发布时间】:2013-05-19 00:29:53
【问题描述】:

我正在尝试在我的根页面上呈现视图“new_view.js.coffee”(用于创建用户的表单)。我正在使用 rails-backbone gem,到目前为止我有这个:

app/views/home/index.html.erb

<div id="container">Loading...</div>

<script type="text/javascript">
  $(function() {
    window.newView = new Example.Views.Users.NewView({model: users});
    newView.render();
    Backbone.history.start();
  });
</script>

它基本上是这个的副本(来自 rails-backbone README.md):

app/views/posts/index.html.erb

<div id="posts"></div>

<script type="text/javascript">
  $(function() {
    // Blog is the app name
    window.router = new Example.Routers.PostsRouter({posts: <%= @posts.to_json.html_safe -%>});
    Backbone.history.start();
  });

我的新观点是这样的:

assets/javascripts/backbone/views/users/new_view.js.coffee

Example.Views.Users ||= {}

class Example.Views.Users.NewView extends Backbone.View
  template: JST["backbone/templates/users/new"]

  events:
    "submit #new-user": "save"

  constructor: (options) ->
    super(options)
    @model = new @collection.model()

    @model.bind("change:errors", () =>
      this.render()
    )

  save: (e) ->
    e.preventDefault()
    e.stopPropagation()

    @model.unset("errors")

    @collection.create(@model.toJSON(),
      success: (user) =>
        @model = user
        window.location.hash = "/#{@model.id}"

      error: (user, jqXHR) =>
        @model.set({errors: $.parseJSON(jqXHR.responseText)})
    )

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

    this.$("form").backboneLink(@model)

    return this

这是我的用户路由器:

users_router.js.coffee

class Example.Routers.UsersRouter extends Backbone.Router
  initialize: (options) ->
    @users = new Example.Collections.UsersCollection()
    @users.reset options.users

  routes:
    "new"      : "newUser"
    "index"    : "index"
    ":id/edit" : "edit"
    ":id"      : "show"
    ".*"        : "index"

  newUser: ->
    @view = new Example.Views.Users.NewView(collection: @users)
    $("#users").html(@view.render().el)

  index: ->
    @view = new Example.Views.Users.IndexView(users: @users)
    $("#users").html(@view.render().el)

  show: (id) ->
    user = @users.get(id)

    @view = new Example.Views.Users.ShowView(model: user)
    $("#users").html(@view.render().el)

  edit: (id) ->
    user = @users.get(id)

    @view = new Example.Views.Users.EditView(model: user)
    $("#users").html(@view.render().el)

“新”模板:

assets/javascripts/backbone/templates/users/new.jst.ejs

<h1>New user</h1>

<form id="new-user" name="user">
  <div class="field">
    <label for="name"> name:</label>
    <input type="text" name="name" id="name" value="<%= name %>" >
  </div>

  <div class="field">
    <label for="email"> email:</label>
    <input type="text" name="email" id="email" value="<%= email %>" >
  </div>

  <div class="actions">
    <input type="submit" value="Create User" />
  </div>

</form>

<a href="#/index">Back</a>

当我转到 localhost:3000 时,我看到的只是“正在加载...”(我输入它是为了查看应用程序是否启动)。同样,我将如何在上面的#container div 中渲染 new_view?

【问题讨论】:

  • 你没有通过模型users 就像示例中一样:@posts...
  • 你的意思是“window.newView = new Example.Views.Users.NewView({model: users}); vs. "window.router = new Example.Routers.PostsRou​​ter({posts: });"?我应该向视图传递与路由器相同的参数吗?
  • 是的。你应该传递一个@users。
  • 所以现在我有&lt;div id="container"&gt;Loading...&lt;/div&gt; &lt;script type="text/javascript"&gt; $(function() { window.newView = new Example.Views.Users.NewView({users: &lt;%= @users.to_json.html_safe -%&gt;}); $('#container').html(newView.render()); Backbone.history.start(); }); &lt;/script&gt;
  • 还是不行

标签: javascript ruby-on-rails backbone.js render


【解决方案1】:

您尚未将渲染的内容附加到正文:

  $(function() {
    window.newView = new Example.Views.Users.NewView({model: users});
    $('body').html(newView.render().$el)
    // newView.render();
    Backbone.history.start();
  });

【讨论】:

  • 我替换了“newView.render();”与您的上述行。我按原样尝试了......以及将“body”部分更改为“#container” - 仍然没有运气。我需要两条线吗?
  • 你所说的“审查”是什么意思?
  • 你必须附加属于 view no view 本身的元素
  • 元素属于视图:$elel,视图:newView.render()
  • 试过了:$("#container").html(newView.render(el));$(el).html(newView.render());$el.html(newView.render()); - 仍然没有,我做得对吗?
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多