【问题标题】:ember.js - router v2 template pathember.js - 路由器 v2 模板路径
【发布时间】:2013-01-26 09:48:51
【问题描述】:

我正在查看路由器 v2,我发现我必须像这样声明模板的完整路径:

WZ.ApplicationRoute = Em.Route.extend
  renderTemplate: ->
    @render('app/templates/nav/nav', outlet: 'nav')

我可以创建一个带有 temmplateName 属性的视图,但我真的不想这样做。

有没有一种方法可以像这样定义我的模板:

@render('nav', outlet: 'nav')

【问题讨论】:

  • 你还有这个问题吗?

标签: ember.js


【解决方案1】:

在典型环境中,渲染模板时不需要指定完整路径。 Ember 没有做任何神奇的事情。它在Ember.TEMPLATES 中检查具有指定名称的模板。启动您的应用程序并从 JS 控制台尝试:

Ember.keys(Ember.TEMPLATES)

我的猜测是您的模板将在app/templates/nav/nav 下而不是导航下。

如何解决这个问题取决于您使用什么来编译车把模板。大多数构建系统都允许您指定模板名称的基本路径。

【讨论】:

    【解决方案2】:

    Ember 使用它的约定来查找模板,它可以是直接的名称,也可以是名称的路径。如果您只键入 nav,则 ember 会假定它是名称。

    最好的文档总是源代码,在这种情况下是(文件:packages/ember-routing/lib/system/route.js):

    render: function(name, options) {
      if (typeof name === 'object' && !options) {
        options = name;
        name = this.routeName;
      }
    
      name = name ? name.replace(/\//g, '.') : this.routeName;
    
      var container = this.container,
          view = container.lookup('view:' + name),
          template = container.lookup('template:' + name);
    
      if (!view && !template) { return; }
    
      this.lastRenderedTemplate = name;
    
      options = normalizeOptions(this, name, template, options);
      view = setupView(view, container, options);
    
      appendView(this, view, options);
    }
    

    对你的问题的回答是一行

    name = name ? name.replace(/\//g, '.') : this.routeName;
    

    因此,ember 的模板名称可以是您为模板指定的名称,也可以是基于所有斜杠转换为点的路径的名称(按照 ember 的约定)。

    2013 年 2 月 8 日更新 - 回答 cmets 中 @sudhanshu 的问题

    模板的默认使用方式是为您的应用程序配置路由器:

    App.Router.map(function() {
      this.route("members");
      this.route("member",     { path: "/members/:refId" } );
      this.route("membernew",  { path: "/member/new" } );
    });
    

    上面的小例子展示了路由器的 3 个特性:

    • “members”只是名称并应用约定,即没有定义路径。因此,emberjs 将自动使用路径/members
    • “成员”使用动态 URL 部分来识别资源并加载正确的成员。在这里,您必须定义路径。
    • "membernew" 还定义了路径,因为我不想使用默认值 /membernew

    按照相同的约定,emberjs 将尝试使用您在路由器中定义的名称加载模板。在上面的示例中,emberjs 期望车把模板具有名称“members”、“member”和“membernew”。

    上面没有显示的一个功能是将路由级联到资源中。请查看http://emberjs.com/guides/routing/ emberjs 团队就该主题写了一个非常好的指南。

    所以,总的来说,emberjs 是基于一些很好的约定,可以让您避免许多编码行。但是,您必须遵守约定。对于更复杂的应用程序,这通常是不可能的。

    【讨论】:

    • 那么在这种情况下控制器如何获取路径说我有NavController,控制器如何找到同名的模板?
    • @sudhanshu 我更新了我的答案帖子,希望更新是你在 cmets 中的问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多