在指令链接功能中动态添加 ng-click

2024-04-21

我正在尝试创建一个指令,允许将元素定义为可点击或不可点击,并且定义如下:

<page is-clickable="true">
    transcluded elements...
</page>

我希望生成的 HTML 为:

<page is-clickable="true" ng-click="onHandleClick()">
    transcluded elements...
</page>

我的指令实现如下所示:

app.directive('page', function() {
    return {
        restrict: 'E',
        template: '<div ng-transclude></div>',
        transclude: true,
        link: function(scope, element, attrs) {
            var isClickable = angular.isDefined(attrs.isClickable) && scope.$eval(attrs.isClickable) === true ? true : false;

            if (isClickable) {
                attrs.$set('ngClick', 'onHandleClick()');
            }

            scope.onHandleClick = function() {
                console.log('onHandleClick');
            };
        }
    };
});

我可以看到,添加新属性后,Angular 不知道ng-click,所以它不会发射。我尝试添加一个$compile设置属性后,但会导致无限链接/编译循环。

我知道我可以检查里面onHandleClick()函数如果isClickable值为true,但我很好奇如何通过动态添加来做到这一点ng-click事件,因为我可能需要与多个其他人一起处理这个事件ng-*指令,我不想增加不必要的开销。有任何想法吗?


更好的解决方案(新):

读完后角度文档 http://docs.angularjs.org/api/ng/service/%24compile我遇到过这个:

您可以将模板指定为表示模板的字符串或指定为 函数接受两个参数 tElement 和 tAttrs(在 下面的编译函数 api)并返回一个表示的字符串值 模板。

所以我的新指令看起来像这样:(我相信这是处理此类事情的适当“角度”方式)

app.directive('page', function() {
    return {
        restrict: 'E',
        replace: true,
        template: function(tElement, tAttrs) {
            var isClickable = angular.isDefined(tAttrs.isClickable) && eval(tAttrs.isClickable) === true ? true : false;

            var clickAttr = isClickable ? 'ng-click="onHandleClick()"' : '';

            return '<div ' + clickAttr + ' ng-transclude></div>';
        },
        transclude: true,
        link: function(scope, element, attrs) {
            scope.onHandleClick = function() {
                console.log('onHandleClick');
            };
        }
    };
});

请注意新的模板函数。现在,我在编译该函数之前操作该函数内的模板。

替代解决方案(旧):

Added replace: true摆脱重新编译指令时的无限循环问题。然后在链接函数中,我只是在添加新属性后重新编译元素。但有一点需要注意,因为我有一个ng-transclude指令在我的元素上,我需要删除它,这样它就不会尝试在第二次编译时包含任何内容,因为没有任何内容可以包含。

这就是我的指令现在的样子:

app.directive('page', function() {
    return {
        restrict: 'E',
        replace: true,
        template: '<div ng-transclude></div>',
        transclude: true,
        link: function(scope, element, attrs) {
            var isClickable = angular.isDefined(attrs.isClickable) && scope.$eval(attrs.isClickable) === true ? true : false;

            if (isClickable) {
                attrs.$set('ngClick', 'onHandleClick()');
                element.removeAttr('ng-transclude');
                $compile(element)(scope);
            }

            scope.onHandleClick = function() {
                console.log('onHandleClick');
            };
        }
    };
});

不过,我认为第二次重新编译模板并不理想,所以我觉得在第一次编译模板之前仍然有办法做到这一点。

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

在指令链接功能中动态添加 ng-click 的相关文章

  • 如何在NodeJs中应用Java/Spring的分层架构?

    我已经尝试学习 NodeJS 有一段时间了 所有书籍和教程似乎都遵循类似的代码结构模式 例子 const express require express const app express app set view engine hbs a
  • 为什么这个对象的“forEach 不是函数”?

    这可能真的很愚蠢 但我不明白为什么这不起作用 var a cat large a forEach function value key map console log value 未捕获的类型错误 a forEach 不是函数 http j
  • Web SQL 将数据插入多行

    我尝试在 Web SQL 数据库中一次将变量插入多行 但使用我所知的所有方法时 我收到错误 INSERT INTO tab a b VALUES v1 v2 v3 v4 gt gt could not prepare statement 1
  • 输入类型货币格式,带逗号和小数位 2

    我只是想问如何制作输入类型文本的货币格式的JavaScript 当您输入数字时 数字是否可能带有逗号 另外 如何使数字固定为 2 个小数 如果我输入 3 位小数 最后一个数字将四舍五入 因此可以是 2 位小数 我有一个仅接受数字的文本框 我
  • 即使 WebPack 构建工作正常,VS Code 显示未找到模块

    我的 VS Code 说它找不到导入 即使我的 WebPack 构建仍然有效 这是进口 import as tf from tensorflow tfjs 以及来自 VS Code 的消息 找不到模块 tensorflow tfjs 您的意
  • NodeJS Express 中每个请求的全局范围

    我有一个基本的快速服务器 需要在每个请求处理期间存储一些全局变量 更深入地说 请求处理涉及许多需要存储在变量中的操作 例如global transaction 当然 如果我使用global范围 每个连接都将共享其事务的信息 并且我需要一个全
  • 将对象传递给jquery中的回调函数

    我最近正在开发小型聊天模块 该模块需要不断检查服务器是否有新消息 我正在向服务器发送 ajax 请求 服务器将保持连接 直到找到新消息 长轮询 Code var chatController function other variable
  • 降低 Nodejs 服务器上的 CPU 利用率

    我正在研究降低 CPU 利用率的有趣方法 在 NodeJS 服务器上 在我的研究过程中 我发现了以下文章 http engineering linkedin com nodejs blazing fast nodejs 10 perform
  • 无需源代码即可部署网站

    我用php开发了网站 我想在没有源代码的情况下部署它 用php可以吗 我可以将网站代码转换为某种中间形式然后进行部署吗 您可以使用 Zend Guard 来编码您的代码 这样它就无法被逆向工程 http www zend com en pr
  • $index 中的 AngularJS 数字

    举例来说 我有以下代码 伪 div index div 结果将是 1 2 3 4 5 6 我怎样才能改变上面的代码以便打印索引 001 002 003 004 005 006 以便索引打印为 3 位数字 您可以使用过滤器轻松完成此操作 首先
  • 在 AMP 中包含自定义 JavaScript 的最佳方式

    我阅读了有关脚本标记的所有文档 但找不到如何在 AMP HTML 中包含自定义 JavaScript 我知道
  • JavaScript 数组中的空项和未定义项有什么区别? [复制]

    这个问题在这里已经有答案了 考虑以下 JavaScript 代码 在节点 REPL 中 gt let a new Array 10 undefined gt a lt 10 empty items gt gt a map e gt 1 lt
  • JS 中的 .Jar 文件

    有谁知道如何在 JS 中访问 jar 文件 我已经用 Java 创建了类并作为 jar 文件导入 我想从 JS 文件访问该类 大家好 我感谢你们所有人 我尝试在 Firefox XUL 中使用 JS 列出文件夹中的文件 但我做不到 然后我决
  • 如何判断CKEditor是否已加载?

    如何确定 CKEditor 是否已加载 我查看了API文档 但只能找到loaded事件 我想检查 CKEditor 是否已加载 因为如果我第二次加载它 我的文本区域就会消失 The loaded活动对我不起作用 instanceReady
  • Javascript onclick隐藏div

    我想使用 javascript 隐藏这个警告 div 我的 javascript 正确吗 我想在单击关闭图标时隐藏 关闭 div images close icon gif div strong Warning strong These a
  • 为什么 useState 会导致组件在每次更新时渲染两次?

    我这里有一段简单的代码 import React useState from react import styles css export default function App const number setNumber useSta
  • RegisterClientScriptCode 在部分回发后不起作用

    以下代码行位于 SharePoint 网站的用户控件中 ScriptManager RegisterClientScriptBlock this this GetType jquery144 false ScriptManager Regi
  • Bootstrap $('#myModal').modal('show') 不起作用

    我不知道为什么 但所有模态功能都不适用于我 我检查了版本和负载 它们都很好 我不断收到此错误消息 Uncaught TypeError modal is not a function 对于隐藏我已经找到了替代方案 代替 myModal mo
  • 根据对象内的值将对象数组分成两部分

    我一直在尝试 并努力 弄清楚如何根据键值对拆分对象数组 长话短说 我有一个火车正在停靠的车站列表 需要将之前的停靠点和未来的停靠点分开 我正在使用的数据如下所示 station code SOC station name Southend
  • Google Hangouts 扩展程序如何创建面板窗口?

    The Doc http code google com chrome extensions windows html说如果你想创建一个面板窗口 你应该使用 chrome windows create type panel function

随机推荐

  • 如何管理共享库中的 spring-cloud bootstrap 属性?

    我正在构建一个库 该库为使用我们的应用程序提供固执己见的配置Spring Cloud Config Eureka设置 这个想法是将此配置作为自定义启动器提供 在各个微服务应用程序中很少或没有与 Spring Cloud 相关的样板 此时 我
  • 续集,关联返回时出现问题

    我目前正在尝试 Sequelize 并有两个对象 一个Person and Position 当获取人员列表时我想得到他们的位置 models var User sequelize define user first name Sequel
  • 为什么 ["A","B","C"].map(String.prototype.toLowerCase.call) 不起作用? [复制]

    这个问题在这里已经有答案了 当然 这会返回您所期望的结果 A B C map function x return x toLowerCase gt a b c 使用 String prototype toLowerCase call 也是如
  • 我如何查看我的应用程序使用了多少超出其虚拟机预算的内存?

    我查看了 DDMS 但没有看到任何内容 谢谢 您应该在 DDMS 的 设备 视图中单击 更新堆 按钮
  • 压缩独特的数据流

    我有大量的整数数组 每个整数都有几千个整数 每个整数通常与前一个整数相同或仅相差一两位 我想将每个阵列缩小到尽可能小 以减少磁盘 IO Zlib 将其缩小到原始大小的 25 左右 这很好 但我不认为它的算法特别适合这个问题 有谁知道对于此类
  • 导航栏中的复选框小部件闪亮

    是否可以在导航栏行中创建复选框小部件 这是一example http www bootply com 103995 我的想法 下面创建一个checkboxInput 但交互性似乎无法正常工作 library shiny ui lt navb
  • 类中的int是存储在栈上还是堆上? [复制]

    这个问题在这里已经有答案了 可能的重复 栈和堆理解问题 https stackoverflow com questions 2559271 stack heap understanding question 有人告诉我使用 var 真的很慢
  • 如何将可观察的响应投射到本地对象

    在当前的 Angular 6 应用程序中 有一个订阅 observable 来自 RESTful 服务的响应 this activatedRoute data subscribe bag gt console log bag this ba
  • Android发送大量短信

    我有一个应用程序 它会向中央服务器发送大量短信 每个用户每天可能会发送约 300 个文本 SMS 消息被用作网络层 因为 SMS 几乎无处不在 而移动互联网却不然 该应用程序旨在供许多移动互联网尚未普及的第三世界国家使用 当我达到 100
  • 最大限度地降低重新分配人员的成本

    我有属于不同类别的个人 他们位于不同的地方 区 这些人口预计将从population值低于 到demand value population and demand by category and zone lt tibble tribble
  • jQuery 选择更改显示/隐藏 div 事件

    我正在尝试创建一个表单 当选择选择元素 parcel 时 它将显示一个 div 但当未选择它时 我想隐藏该 div 这是我目前的标记 到目前为止 这是我的 HTML div class row Type div
  • 从 AOSP 编译电子邮件应用程序

    我想向 AOSP 电子邮件应用程序添加一些不再受支持的功能 所以我克隆了存储库here https github com android platform packages apps email 这是一个 Eclipse 项目 并将其迁移到
  • C++:防止多个函数同时执行

    我问这个问题是因为mutex我发现文档处理单个函数 我认为我的情况很常见 我的问题是以下代码是否不仅会阻止func1 OR func2 并行执行多次 但它是否也会阻止func1 AND func2 同时执行 include
  • 在 UITableView 标头中包含的 UIImageView 上设置accessibilityLabel

    我有一个UITableView我内置的loadView 我在做的事情之一loadView是创建一个UIView充当表头并填充UIImageView进去 图像视图包含作为风格化标题的图像 因此我想为 VoiceOver 用户添加辅助功能标签
  • 不要让 IE 选择并复制使用 jQuery .hide() 隐藏的表行

    我在数据表顶部有一个 jQuery 即时搜索栏 所有符合搜索条件的记录都将可见 row show 其余的都是隐藏的 row hide Problem 搜索后 我使用鼠标从搜索结果中选择 复制行列表并将其粘贴到 Excel 中 隐藏 记录也会
  • 使用 CSS 分布内联元素

    有没有一种简单的方法可以使用 CSS 在父块容器中分发内联元素 将边距设置为自动不起作用 因为内联元素之间的边距设置为 0 而且我不想弄乱百分比 因为内容是动态的 特别是 我在段落 p 中有几个锚元素 a 跨越其容器的 80 我正在寻找一种
  • 如何获取TextView的行距?

    有没有办法获得行间距TextView in Android 我尝试寻找fontMetrics of the Paint of the TextView并这样做 tv1 getPaint getFontMetrics pfm float fo
  • 如何在Android中加载大图像并避免内存不足错误?

    我正在开发一个使用大图像的应用程序 1390 870 150kb 50kb 我在点击触发器 ImageView 时添加图像 在某个时刻我遇到内存不足错误 java lang OutOfMemoryError E AndroidRuntime
  • 何时应该处理 ManualResetEvent?

    我正在使用一个使用 ManualResetEvent 同步线程的应用程序 FxCop 让我处理掉这些物品 我发现以下讨论告诉我同样的事情 我需要 Dispose 或 Close EventWaitHandle 吗 https stackov
  • 在指令链接功能中动态添加 ng-click

    我正在尝试创建一个指令 允许将元素定义为可点击或不可点击 并且定义如下