【发布时间】:2014-01-06 08:01:14
【问题描述】:
我的想法是将输入包装到自定义指令中,以保证整个网站的外观和行为一致。我还想包装引导 ui 的日期选择器和下拉菜单。此外,该指令应处理验证和显示工具提示。
HTML 应该如下所示:
<my-input required max-length='5' model='text' placeholder='text' name='text'/>
或
<my-datepicker required model='start' placeholder='start' name='start'/>
在指令中我想创建一个 dom 结构,例如:
<div>
<div>..</div> //display validation in here
<div>..</div> //add button to toggle datepicker (or other stuff) in here
<div>..</div> //add input field in here
</div>
我尝试了各种方法来实现这一点,但总是遇到一些权衡:
使用 transclude 和 replace 将输入插入到指令 dom 结构中(在这种情况下,指令将被限制为 'A' 而不是 'E',就像上面的示例一样)。这里的问题是,没有简单的方法可以访问嵌入的元素,因为我想在 datepicker 的情况下添加自定义属性。我可以使用 transclude 函数,然后在链接函数中重新编译模板,但这对于这个任务来说似乎有点复杂。这也会导致日期选择器的转入范围和切换状态出现问题(一个在指令范围内,另一个在转入范围内)。
仅使用替换。在这种情况下,所有属性都应用于最外层的 div(即使我在 compile 函数中生成了模板 dom 结构)。如果我只使用输入作为模板,那么属性在输入上,但我需要在链接函数中生成模板然后重新编译它。据我了解angular的阶段模型,希望避免在link函数中重新编译和更改模板dom(虽然我见过很多人这样做)。
目前我正在使用第二种方法并在链接功能中生成模板,但我想知道是否有人有更好的想法!
【问题讨论】:
-
您希望能够添加什么样的自定义属性?我认为,您希望指令呈现到的 HTML 的完整示例(自定义属性和所有)在这里会很有用。
-
在日期选择器的情况下,我想设置应用程序范围的标准值。生成的 html 输入标记应如下所示:
<input type="text" data-datepicker-popup="" data-is-open="opened" data-current-text="{{current}}" data-close-text="{{text}}" data-clear-text="{{clear}}" data-show-weeks="{{showweeks}}" data-starting-day="{{startingday}}" placeholder="{{placeholder}}" data-ng-model="start" name="start" required="required" class="ng-isolate-scope ng-pristine ng-valid ng-valid-required">
标签: angularjs angularjs-directive angular-ui-bootstrap