【问题标题】:Template re-renders and doesn't display links in Backbone/Marionette - backbonerails tutorial模板重新渲染并且在 Backbone/Marionette 中不显示链接 - 主干轨教程
【发布时间】:2015-12-13 19:54:45
【问题描述】:

我正在做一个http://www.backbonerails.com/ 教程,它有点过时了。我正在尝试渲染 headers.jst.eco 模板,它将“BackBoneRails Demo”显示为标题,并在 getLinksCollection 的 list_controller.js.coffee 链接中呈现 Backbone.Collection 的链接(下面的代码)。相反,它会多次重新呈现标题模板,不加载链接/名称,并且在屏幕截图中如下所示

这里是源代码

app/assets/javascripts/backbone/apps/header/list/templates/_header.jst.eco

<a href="#"><%= @name %></a>

app/assets/javascripts/backbone/apps/header/list/templates/headers.jst.eco

<nav class="navbar navbar-default" id="header">
    <div class="container">
        <div class="pull-left">
            <span class="navbar-brand">BackboneRails Demo</span>
        </div>
        <ul class="nav navbar-nav pull-right">
        </ul>
    </div>

app/assets/javascripts/backbone/apps/header/list/list_view.js.coffee

@Demo.module "HeaderApp.List", (List, App, Backbone, Marionette, $, _) ->

  class List.Header extends Marionette.ItemView
    template: "header/list/templates/_header"
    tagName: "li"

  class List.Headers extends Marionette.CompositeView
    template: "header/list/templates/headers"
    itemView: List.Header
    itemViewContainer: "ul"

    </nav>

app/assets/javascripts/backbone/apps/header/list/list_controller.js.coffee

@Demo.module "HeaderApp.List", (List, App, Backbone, Marionette, $, _) ->

  List.Controller = 

    listHeader: ->
      links = @getLinksCollection()

      headerView = @getHeaderView links
      App.headerRegion.show headerView

    getLinksCollection: ->
      new Backbone.Collection [
        { name: "Link 1"}
        { name: "Link 2"}
        { name: "Link 3"}
        ]

    getHeaderView: (links) ->
      new List.Headers
        collection: links

app/assets/javascripts/backbone/apps/header/header_app.js.coffee

@Demo.module "HeaderApp", (HeaderApp, App, Backbone, Marionette, $, _) -> 
  @startWithParent = false

  API =
    listHeader: ->
      HeaderApp.List.Controller.listHeader()


  HeaderApp.on "start", ->
    API.listHeader()

app/assets/javascripts/backbone/app.js.coffee

@Demo = do (Backbone, Marionette) ->
    App = new Marionette.Application

    App.addRegions
        headerRegion: "#header-region"
        mainRegion: "#main-region"
        footerRegion: "#footer-region"

    App.addInitializer ->
      App.module("HeaderApp").start()
      App.module("FooterApp").start()

    App.on "start", ->
        if Backbone.history
          Backbone.history.start()

    App 

(不包括 FooterApp 代码,因为它可以工作并且与标题模板无关)

【问题讨论】:

    标签: backbone.js coffeescript marionette backbone-views backbone.js-collections


    【解决方案1】:

    哈哈,真是巧合。前几天买了这个系列。绝对喜欢它。

    木偶发生了一些微妙的变化。 itemViewìtemViewContainer 现在称为 childViewchildViewContainer

    List.Headers = App.Views.CompositeView.extend({
        template: 'header/list/templates/headers',
        childView: List.Header,
        childViewContainer: 'ul'
      });
    

    (对不起,肮脏的 JavaScript,但我比 CoffeScript 更习惯;))

    【讨论】:

    • 谢谢!哦,伙计,我希望教程得到更新。由于 Rails gems 的更新等原因,我必须弄清楚很多事情才能使它工作。你还有其他正在使用的主干教程吗?
    • @CodeCrack 我听到了 :) 我实际上使用 Sails.js 作为后端。但我认为轻微的颠簸让我学到了更多!我在 Backbone 上找到的其他资源非常垃圾:( 将所有逻辑放在视图等中。我真的很喜欢他的方法。如果你还没有玩过它,我建议另外使用 Marionette Inspector到 Brians 调试技术。
    • 我实际上是在使用 Sails.js 来工作,所以我不介意在经历这个过程中换掉它。我也很惊讶 Backbone 资源都已经过时或者不是很好,因为它是以前最流行的框架之一。我正在学习它,因为我们在后端使用 SailsJS,在前端使用 Backbone/Marionette。您有什么联系方式吗,也许我们可以在学习本教程的过程中互相帮助!
    • @CodeCrack 听起来是个好主意!你可以给我发电子邮件 emtholin@gmail.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多