AEM很明显-是否可以创建自定义数据属性?

AEM很明显-是否可以创建自定义数据属性?,aem,sightly,Aem,Sightly,我想知道是否有办法创建自定义属性,例如: <div data-sly-myAttribute="${whatever}"></div> 就像自定义JSP标记一样 编辑: 据报道,截至2014年5月4日,这是不可能的。 这方面有什么新消息吗?编辑:看起来这在这一点上是不可行的,因为所需的impl类不是由它们所包含的包导出的。感谢拉杜·科特斯库在评论中指出这一点 我会在下面留下我的原始答案。如果有人真的需要或只是想要,你可以在github上使用Sling repo

我想知道是否有办法创建自定义属性,例如:

   <div data-sly-myAttribute="${whatever}"></div>

就像自定义JSP标记一样

编辑

据报道,截至2014年5月4日,这是不可能的。
这方面有什么新消息吗?

编辑:看起来这在这一点上是不可行的,因为所需的
impl
类不是由它们所包含的包导出的。感谢拉杜·科特斯库在评论中指出这一点

我会在下面留下我的原始答案。如果有人真的需要或只是想要,你可以在github上使用Sling repo,添加/部署你自己的插件,或者简单地导出必要的
impl
包,并将插件添加到你自己的代码库中



通过查看Sightly源代码,您可以看到他们称之为插件的列表,这些插件为每个Sightly block语句提供了实现。这些可以在这里找到:

这只是一个猜测,我还没有尝试过,但似乎您可以提供自己的类,它扩展了
org.apache.sling.scripting.sighly.impl.plugin.PluginComponent
,是一个
插件
OSGi服务。我会尝试复制一个现有的插件,看看你是否能让它使用一个新的名字。也许是
TextPlugin
,它看起来很直截了当

希望这将为您指明一个方向,带来一些乐趣:)

也许是这样的

@Component
@Service(Plugin.class)
@Properties({
        @Property(name = Plugin.SCR_PROP_NAME_BLOCK_NAME, value = "foo"),
        @Property(name = Plugin.SCR_PROP_NAME_PRIORITY, intValue = 9)
})
public class FooPlugin extends PluginComponent {

    @Override
    public PluginInvoke invoke(final Expression expression, PluginCallInfo callInfo, final CompilerContext compilerContext) {
        return new DefaultPluginInvoke() {

            @Override
            public void beforeChildren(PushStream stream) {
                String variable = compilerContext.generateVariable("fooContent");
                stream.emit(new VariableBinding.Start(variable,
                        compilerContext.adjustToContext(expression, MarkupContext.TEXT, ExpressionContext.TEXT).getRoot()));
                stream.emit(new OutVariable(variable));
                stream.emit(VariableBinding.END);
                Patterns.beginStreamIgnore(stream);
            }

            @Override
            public void afterChildren(PushStream stream) {
                Patterns.endStreamIgnore(stream);
            }
        };
    }
}
然后在一个文件中使用它

<div data-sly-foo="${properties.jcr:description}">This text should get replaced</div>
应替换此文本
如果我有时间尝试,我会更新这个答案


注意:但是,如果您在实际场景中尝试这样做,那么可能有更好的方法来解决您试图用这种方法解决的问题。sightly团队试图为我们提供所需的一切,以完成sightly的目标。

不,不可能创建您自己的块元素,因为该实现将不符合规范[0]。除了添加一个新插件外,还有更多的微妙之处,其中一个是在同一个HTML元素上使用多个块时块元素的优先级;更不用说,如果这是可能的,没有什么可以阻止您覆盖提供的插件

但是,如果您认为需要一个新的块元素,那么请向规范发送一个pull请求,并提供一个定义良好的用例。此外,如果您在ApacheSling开发邮件列表[1]上讨论您的用例,可能会有所帮助-您需要的是其他开发人员也想到的东西,在这种情况下,协作肯定有助于找到问题的最佳解决方案

[0]-

[1] -

的确,创建自定义属性会很好,例如,可以消除显式使用@context='styleString'的需要。我以前试过这个,但没有成功。不知何故,FooPlugin在pluginregistry中不可用。因此,您最终会出现一个错误,即插件foo不存在。无论如何,由于其他原因,我们没有采用这种方法(创建自定义ATR)。您将无法注册自定义插件以支持新的
数据-*
块元素。虽然OSGi已经被用于DI,但是impl包并没有被导出,因此在包的外部是不可见的。啊,是的,这是一个很好的观点@RaduCotescu。更新了我的答案,并对你的答案进行了更新:-)你可以从源代码自定义构建
org.apache.sling.scripting.sighly
,以导出所需的包。@awadheshv确实,我也会补充这一点。我们用另一种方法解决了我们的用例,但我肯定会在将来研究它。我在考虑Angular的属性指令。当然,在某些用例中,您希望扩展模板引擎以满足客户需求。为什么要关闭API?当API使引擎更具动态性和灵活性时,您仍然可以锁定一些核心内容,但可以根据客户需求进行扩展和调整。我不是在说一般的东西,这将是规范的有效用例,但甚至比。。。您甚至不能为现有插件编写过滤器,只要运行时扩展,以防它们被调用。我非常喜欢,但从未使用过模板引擎,没有可能以某种方式进行扩展。