【问题标题】:Handlebars Partial Data with Dot Notation带点符号的车把部分数据
【发布时间】:2020-10-30 12:42:59
【问题描述】:

在 Handlebars 中,我需要覆盖部分数据,这些数据的范围是 JS 对象。 index.hbs 文件呈现具有不同数据的多个部分,但模块属性需要在全局数据对象内限定范围。使用点符号覆盖部分属性无法编译。

索引.hbs

<body>
  {{> User }}
  {{> User user.name="laura" }} // fails to compile - how to overwrite? 
</body>

用户.hbs

<div>
  Name is: {{name}}
  Location is: {{location}}
</div>

索引.js

import index from "Index.hbs";
import user_partial from "User.hbs";

data = {
  user: {
    name: "kevin", 
    location: "bar"
  }
}

Handlebars.registerPartial(user, user_partial); 
document.innerHTML = Handlebars.compile(index)(data); 

【问题讨论】:

    标签: javascript templates handlebars.js partials


    【解决方案1】:

    documentation 表示上下文像 {{&gt; myPartial myOtherContext }} 一样传递给部分,而附加参数像 {{&gt; myPartial parameter=favoriteNumber }} 一样传递。

    因此,您似乎可以通过将 user 作为上下文并将覆盖作为参数传递来实现您的目标。您的模板将变为:

    {{> User user }}
    {{> User user name="laura" }}
    

    我创建了一个fiddle 供参考。

    【讨论】:

    • 是的,但理想情况下我更喜欢传递嵌套属性。同样,如果一个属性是双重嵌套的,或者如果一个属性来自第一级而第二个属性来自第二级,您将如何处理?
    • 这似乎是一个奇怪的用例。您实际上是在谈论从模板中创建一个新对象。有人可能会问为什么不创建对象然后将其传递给模板。但是,如果您真的想在模板中执行此操作,那么我认为您需要创建一个自定义帮助器。
    • 我同意这是一个奇怪的用例;这个想法是每个模块类型都有一个带有默认数据的全局数据规范,然后在实现时可以传递一个模块覆盖。嵌套属性语法确实提供了一定程度的清晰度,但令我惊讶的是,我在任何地方都找不到有关此文档的信息
    • 我也有同样的问题,举个例子可能会有所帮助。您有一个按钮模块,一个包含一系列按钮作为一组的模块,以及一个包含该按钮组的模块。最后一个模块想要强制其中一个按钮的属性 - 你如何从祖父母设置这个子属性?例如:{&gt;button_set submit.text='continue'}您不能将上下文设置为只是按钮,否则按钮集完全失败,并且扁平化数据不适用于模块化(或至少增加重复)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多