【问题标题】:Directive, wrap content and keep attributes on original element指令,包装内容并保留原始元素的属性
【发布时间】:2014-05-20 20:04:42
【问题描述】:

我在创建一个包装该指令所应用的元素(及其子元素)的指令时遇到了一些麻烦。考虑到 AngularJS 中许多其他常见的事情是多么容易,我不明白为什么这个看似常见的场景会如此困难,所以很可能我在这里遗漏了一些东西。

我想要做的是将一个选择元素包装在一个 div 中。 我正在使用 transclude 来保留原始选择元素及其内容,但我无法使其正常工作。

HTML 如下所示:

<select mlb-select ng-options="opt.val as opt.text for opt in mlb" ng-model="mlbOpt"></select>

我的指令看起来像这样:

directiveModule.directive("mlbSelect", function(){
    return {
        template: '<div class="mlb-select">'
                    + '<select ng-transclude></select>'
                    + '</div>',
        transclude: 'element',
        replace: true
    }
});

生成的 HTML 如下所示:

<div class="mlb-select ng-pristine ng-valid" mlb-select ng-options="opt.val as opt.text for opt in mlb" ng-model="mlbOpt">
    <select ng-transclude class="ng-scope"></select>
</div>

当然,这不是我想要的。为什么我的选择元素的属性被添加到包装 div 而不是我使用 ng-transclude 属性指定的元素? select 元素需要保留 ng-options 和 ng-model 属性。

我需要做什么才能做到这一点?

【问题讨论】:

    标签: javascript angularjs angularjs-directive transclusion


    【解决方案1】:

    据我所知,这样做的唯一方法是在包装元素中指定包含嵌入的指令,例如:

    <div mlb-select>
        <select ...></select>
    </div>
    

    当然,如果你的情况与上述完全一样,那么这样做是没有意义的。

    在这个问题的上下文中,嵌入大致如下:

    1. 转入的内容是具有transclude: true 指令的元素的内容;在您的情况下,&lt;select&gt; 的内容是空的!

    2. 转入的内容放置在指令模板中指定ng-transclude的元素内。

    【讨论】:

    • 感谢您的快速回复!我想要这样的原因是我希望能够通过向选择元素添加兄弟姐妹来扩展指令。我设法通过制作自己的“create-wrapped-select”指令来解决我的问题,该指令在模板中创建选择元素。问题是我不能支持 select 元素上的任意属性,但现在已经足够了。
    • 太糟糕了,这是不可能的。我正在使用一个 CSS 框架,该框架使用自定义下拉按钮设置选择样式,该按钮将用于我的项目中的所有选择下拉列表,但我想创建一个指令,将标准选择转换为包装表单。现在我不得不用指令元素包装选择,这只会让我对 html 进行一些简化。
    猜你喜欢
    • 2012-07-19
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多