将输入包装在角度指令中

2024-06-26

我的想法是将输入包装到自定义指令中,以保证整个网站的外观和行为一致。我还想包装 bootstrap ui 的日期选择器和下拉菜单。此外,该指令应该处理验证并显示工具提示。

HTML 应该看起来像这样:

<my-input required max-length='5' model='text' placeholder='text' name='text'/>

or

<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>

我尝试了各种方法来实现这一目标,但总是遇到一些权衡:

  1. 使用嵌入和替换将输入插入到指令 dom 结构中(在这种情况下,指令将被限制为“A”而不是上面示例中的“E”)。这里的问题是,没有简单的方法来访问嵌入的元素,因为我想在日期选择器的情况下添加自定义属性。我可以使用嵌入函数,然后在链接函数中重新编译模板,但这对于此任务来说似乎有点复杂。这也会导致日期选择器的嵌入范围和切换状态出现问题(一个在指令范围中,另一个在嵌入范围中)。

  2. 仅使用替换。在这种情况下,所有属性都应用于最外层的div(即使我在编译函数中生成模板dom结构)。如果我仅使用输入作为模板,则属性位于输入上,但我需要在链接函数中生成模板,然后重新编译它。据我了解角度的​​阶段模型,我希望避免重新编译和更改链接函数中的模板dom(尽管我见过很多人这样做)。

目前我正在使用第二种方法并在链接函数中生成模板,但我想知道是否有人有更好的想法!


我认为这是执行此操作的正确方法。就像OP一样,我希望能够使用属性指令来包装input。但我也希望它能与ng-if等等,而不会泄漏任何元素。正如 @jantimon 指出的,如果您不清理包装元素,它们将在 ng-if 销毁原始元素后徘徊。

app.directive("checkboxWrapper", [function() {
    return {
      restrict: "A",
      link: function(scope, element, attrs, ctrl, transclude) {
        var wrapper = angular.element('<div class="wrapper">This input is wrappered</div>');

        element.after(wrapper);
        wrapper.prepend(element);

        scope.$on("$destroy", function() {
          wrapper.after(element);
          wrapper.remove();
        });
      }
    };
  }
]);

And 这是一个笨蛋 http://plnkr.co/edit/PUUJ6Y2vP1tCOMOWGYx2?p=preview你可以玩。

重要的: scope vs element$销毁。您必须将清理工作放入scope.$on("$destroy")并且不在element.on("$destroy")(这就是我最初尝试的)。如果您在后者(元素)中执行此操作,则“ngIf end”注释标记将被泄漏。这是由于 Angular 的 ngIf 在执行错误逻辑时如何清理其结束注释标签。通过将指令的清理代码放在 $destroy 范围内,您可以将 DOM 放回原样,就像包装输入之前一样,因此 ng-if 的清理代码很高兴。当 element.on("$destroy") 被调用时,在 ng-if falsey 流程中为时已晚,无法在不导致注释标记泄漏的情况下解开原始元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将输入包装在角度指令中 的相关文章

随机推荐

  • 在 OrientDB Studio 中显示节点标签

    我试图让 OrientDB Studio 显示一个字符串作为每个节点的标签 就像 Susheel Kumar 的屏幕截图所示 但是 当我运行 Susheel 的代码 在下面发布以供后代使用 时 所有节点都显示为由其 rid 字段标记 如以下
  • 打开 bootstrap.min.css 导致 VS2010 崩溃

    知道为什么打开 bootstrap min css 的缩小版本会导致 VS2010 崩溃吗 对于非缩小文件不会发生这种情况 我知道 我知道 一个有效的解决方案可能是 不要在 VS2010 中打开 bootstrap min css 这与我告
  • 谷歌地图 - 缩放时保持居中

    在 Google 地图中 我希望在放大或缩小时能够将地图中心保持在我所在位置的标记上 这是 Ingress 所做的事情 无论您在何处双击 或双击 或在何处捏合 地图都会保持以标记为中心 所以有可能 我现在想到的最好的是 google map
  • 使用具有不同参数的 Jackson for List 将 JSON 映射到 pojo

    JSON 格式 0 cast showname woh pagle type Episodes video src video mp4 DRM False 这里的问题是我遇到以下异常 org codehaus jackson map Jso
  • 如何用ListBox制作自定义控件?

    我想用自定义的项目模板制作水平ListBox 所以我制作了它的基本模板 但是 我找不到将 事物 绑定到 WPF XAML 的示例 尤其是在 ListBox 填充了自定义项的情况下 我只是想动态添加 删除列表框中的项目 其中包含图像 标签 组
  • 在 $git push -u origin main 命令之后,Git bash 不请求任何身份验证,实际上什么也不做

    当我尝试将代码上传到 github 时 以下是我在 Git Bash 终端中执行的步骤 当我尝试使用将代码推送到 github 时 git push u origin main光标移动到下一行并持续闪烁 但不执行任何操作 git remot
  • 当 DbContext 位于单独的项目中时,Visual Studio 2022 .NET 6 脚手架不起作用

    我正在设置我的第一个 NET 6 MVC 站点 但遇到了第一个障碍 我的解决方案中有 3 个项目 域 包含实体 基础设施 具有应用程序数据库上下文 WebUi 包含网络界面 添加迁移和更新数据库工作正常 但是当我尝试搭建控制器时 出现错误
  • C# 中的高级替换

    我喜欢用 C 替换 xml 字符串 中的一些属性 示例 XML
  • Java 中的双精度小数格式

    我在格式化双精度数的小数时遇到一些问题 如果我有双重值 例如4 0 如何格式化小数 使其变为 4 00 其中一种方法是使用数字格式 http docs oracle com javase tutorial i18n format decim
  • 停止重复 UIImage 背景图案图像 - Swift

    我在 UITableView 中使用滑动来删除 在滑动中我需要添加图像 当我添加图像时 它会重复 如何停止重复 func tableView tableView UITableView editActionsForRowAt indexPa
  • React Router - 如何约束路由匹配中的参数?

    我真的不知道如何使用正则表达式等来约束参数 如何区分这两条路线呢
  • 如何解决Spring Data JPA中的N+1问题?

    我使用 Spring Data JPA 作为持久层 并且面临 N 1 问题 我还使用规范 API 因为我发现很难解决 N 1 问题 请帮忙 Entity public class PopulationHealth Id private in
  • 使用存储过程并发访问MySQL数据库

    我有一个存储过程 它将读取然后增加数据库中的值 许多程序同时使用这个特定的过程 我担心并发问题 特别是读写器问题 有人可以建议我任何可能的解决方案吗 thanks 首先 正如另一篇文章中所述 使用 InnoDB 从 MySQL 5 5 开始
  • Geo Fix 在 Android SDK 2.2 中不起作用

    我正在尝试测试 Android 应用程序 我需要发送模拟位置来测试这一点 我已经注册了 requestlocation update 方法 如下 locationManager requestLocationUpdates bestProv
  • 在 Portlet Liferay 6.1 内呈现 Liferay 页面 URL

    我是 liferay 的新手 而且我几乎确信这非常简单 使用速度标记 我希望能够生成指向 Liferay 网站内页面的链接 并将它们嵌入到不同页面上的 portlet 中 我对如何完成它有一个模糊的想法 所以我到处搜索 认为它会发布在某个地
  • 如何在 Xcode 4.5 中添加旧版本的 iOS SDK

    我在这里复制了 iOS 5 1 SDK 应用程序 Xcode app Contents Developer Platforms iPhoneOS platform Developer SDKs 但是 我仍然无法在 Xcode 中选择基础 S
  • 如何在 webpack 2 和 typescript 以及 Angular 2 中使用 tree-shaking?

    我已经用 Angular 设置了 webpack 2 大多数情况下它似乎可以工作 但它似乎并没有做到这一点tree shaking 因为我有一个几乎不执行任何操作的应用程序 并且vendor js仍然是 800 KB 似乎关于如何打开 tr
  • 可变大小结构 C++

    这是在 C 中创建可变大小结构的最佳方法吗 我不想使用向量 因为初始化后长度不会改变 struct Packet unsigned int bytelength unsigned int data Packet CreatePacket u
  • 如何从react-navigation标头调用Screen/Component类方法

    我需要从 React 导航标头调用 SearchScreen 类方法 导航器看起来像这样 Search screen SearchScreen path search query navigationOptions title Search
  • 将输入包装在角度指令中

    我的想法是将输入包装到自定义指令中 以保证整个网站的外观和行为一致 我还想包装 bootstrap ui 的日期选择器和下拉菜单 此外 该指令应该处理验证并显示工具提示 HTML 应该看起来像这样