Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从控制器触发指令的更好方法

从控制器触发指令的更好方法
EN

Stack Overflow用户
提问于 2015-10-09 13:01:43
回答 4查看 366关注 0票数 3

我有一个指令,它需要根据控制器中服务调用的结果执行一些DOM操作。以下是我目前正在遵循的方法:

1)在每个控制器作用域中创建一个与view中的每个指令相对应的触发器对象,以便在需要时执行dom操作。

2)创建指令,根据控制器设置的值进行dom操作;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.directive("myDirective", function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            attrs.$observe('myDirective', function (value) {
                if (value === "true") {
                    $(element).text("Scrolled to####" + $(element).data("scroll"));
                }

            });
        }
    };
});

3)在相应的控制器方法中,将值设置为true以触发指令功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.controller("controller1", ["$scope", function ($scope) {
    $scope.trigger1 = false;

    $scope.triggerDirective1 = function () {

        $scope.trigger1 = true;
    };
    $scope.trigger2 = false;

    $scope.triggerDirective2 = function () {

        $scope.trigger2 = true;
    };
}]);

<div id="c1" ng-controller="controller1">Controller 1
    <br>List 1
    <div my-directive="{{trigger1}}" data-scroll="20"></div>List 2
    <div my-directive="{{trigger2}}" data-scroll="30"></div>
    <button ng-click="triggerDirective1()">Trigger Directive 1</button>
    <button ng-click="triggerDirective2()">Trigger Directive 2</button>
</div>

完整的代码在这里- http://jsfiddle.net/qec35dq4/

我发现这种方法不太好,原因如下:

1)附加了指令的视图中将有多个元素

2)每个指令触发器都是independent.At的,任何时候只有一个指令会在action.Depending中,在视图中的指令数量上,我必须跟踪相应控制器中的所有触发器。

有没有更好的方法来解决这个问题,这样就可以避免在控制器中跟踪这个触发器作用域对象的依赖?我想到了使用$broadcast/$emit,$on。但不要认为这将是一个好的解决方案,.Please让我知道你的想法。

提前感谢您的帮助

编辑:

新提琴- http://jsfiddle.net/86pk8LtL/

更改了一点的例子,以反映更多的是什么,我试图实现-将有多个列表在页面上,这个指令将是applied.Based的一些逻辑从后端的一些项目,需要在列表中选择。一旦选择了项,就应该滚动列表,以便第一个选择的项出现在视图中(在本例中,我正在硬编码scrollposition using data attributes.But in reality指令来执行计算),此指令的目的只是处理“滚动到视图”部分,这就是为什么我对保留它的范围属性持怀疑态度。请注意,当前的方法运行良好。我只是想看看有没有更好的方法。

EN

回答 4

Stack Overflow用户

发布于 2015-10-17 11:57:02

AngularJS实际上并不像事件驱动库那样使用DOM查询。我建议使用控制器抓取。因为Angular支持OOP标准,所以尝试嵌套你的控制器,子控制器的作用域是从父控制器继承的,这意味着你可以观察到哪个元素被触发了。看一下这个基本的示例http://jsfiddle.net/qec35dq4/3/,我建议不要观察属性,而是将模型传递到指令的作用域中。这将帮助您避免观察属性更改。

最重要但不是最后的一点是,您实际上不需要关注元素的属性更改。它可以通过您的指令的attrs获得:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.directive("myDirective", function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            attrs.$observe('myDirective', function (value) {
                if (value === "true") {
                    $("#result").text(attrs.msg);
                }

            });
        }
    };
});

编辑这里是一个基于你最新JSFiddle的demo

票数 1
EN

Stack Overflow用户

发布于 2015-10-13 22:13:04

上周我不得不做这样的事情。假设你不想写一个以上的指令,跨元素指令dom操作可能会很棘手,但当我这样做的时候,我通过ID查找我想要的元素,这将使你不必在作用域上定义方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="trigger1"></div>List 2
<div id="trigger2"></div>
<button my-directive="trigger1" data-scroll="20">Trigger Directive 1</button>
<button my-directive="trigger2"  data-scroll="30">Trigger Directive 2</button>

和指令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.directive("myDirective", function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
                var idElem = document.getElementById(attrs.myDirective);
                var elementToChange = angular.element(idElem);
                element.on("click", function(){
                    elementToChange.text("Scrolled to####" + attrs.dataScroll);
                });
            });
        }
    };
});
票数 0
EN

Stack Overflow用户

发布于 2015-10-17 09:10:30

看看这条指令:https://github.com/iameugenejo/ngScrollTo这似乎是实现你想要的东西的一种很好的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33038984

复制
相关文章
从视图到控制器的传值方法(表单)
Views中: 将数据提交到某个控制器的方法中,在该方法中去做处理 <form action="/控制器/get"method=“post”> 姓名:<input type="text" name="SName"/> //SName是属性名称 性别:<input type="radio" name="sex" value="男"/>; <input type="radio" name="sex" value="女"/> //sex是属性名称 <input type="submit" valu
wfaceboss
2019/04/08
1.9K0
如何更好的使用G70指令?
产品的加工精度通常在精加工阶段得到保证,G71及G73指令粗加工之后通过G70指令完成产品精加工,下面介绍两种方法保证产品的加工精度。
lrglu
2022/06/30
9200
如何更好的使用G70指令?
从补丁追溯漏洞触发路径
查看github中的补丁信息Fixed chunk size parsing. · nginx/nginx@818807d (github.com)如下:
FB客服
2021/11/08
6970
从补丁追溯漏洞触发路径
shiro触发doGetAuthorizationInfo方法的几种方式
针对ftl等页面,可直接在页面中使用标签来来标注对应的请求。进入该页面时扫描到对应的标签进行权限校验。
程序新视界
2021/01/30
3.7K0
软件打包,有没有更好的方法?!
最近,一位朋友分享了关于亚马逊内部构建系统(https://gist.github.com/terabyte/15a2d3d407285b8b5a0a7964dd6283b0)的设计要点,这也让我对于软件打包这事有了新的认识。
深度学习与Python
2023/10/16
2340
软件打包,有没有更好的方法?!
从ObjectPool到CAS指令
相信最近看过我的文章的朋友对于Microsoft.Extensions.ObjectPool不陌生;复用、池化是在很多高性能场景的优化技巧,它能减少内存占用率、降低 GC 频率、提升系统 TPS 和降低请求时延。
InCerry
2022/11/14
3200
input标签checkbox选中触发事件的方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
4.7K0
从空间混合中采样效果更好
摘要:我们的研究结果表明强烈的空间混合速度比邻域的增长速度快,这意味着旋转系统存在有效的完美采样器。 我们新的基于重采样的算法绕过了这条线的先前工作的主要障碍,即我们的算法适用于一般旋转系统,并且不需要问题的其他结构。 此外,我们的框架自然地结合了空间混合属性以获得线性预期运行时间。 使用这种新技术,我们为有界度图和带有指数邻域增长的图中的着色提供了当前最佳的完美采样算法。
罗大琦
2019/07/18
4220
触发OSR 编译(以goto指令为例)及安装与卸载
决定一个方法是否为热点代码的因素有两个:方法的调用次数、循环回边的执行次数。即时编译便是根据这两个计数器的和来触发的。为什么 Java 虚拟机需要维护两个不同的计数器呢?
全栈程序员站长
2021/04/07
1.1K0
从TRAS Connection::send分析EPOLLOUT触发时机
1.NetThread::send强制触发EPOLLOUT, epoll_wait执行NetThread::processPipe,第一次发包
awk
2018/09/08
7890
原来需要调用和触发方法的地方修改
现注册文件中卸载的方法复制代码 public override async Task UninstallAsync(IServiceProvider serviceProvider, Func<Task> unsinstallFunc)http://lx.gongxuanwang.com/sszt/7.htm
用户7737280
2021/11/10
3160
SDRAM控制器设计(数字控制器的两种设计方法)
这次要来解决上次留下来的刷新问题,在100us后首先要经过两次刷新才进行模式寄存器设置。这颗SDRAM芯片需要每隔64ms对8192行(列地址10-位,行地址13位)的每一个存储电容进行一次刷新,因为不刷新电充会泄露电流导致存储信息丢失。那每一行的刷新时间为64/8192 ≈ 7810ns,注意刷新是以行为单位,器芯片内部有一个计数器,这个计数器不是时钟直接驱动的,而是AUTO PRECHARGE驱动,每发一次atuoprecharge命令这个计数器加1,我们是看不到的也无法对其直接置数,这个计数器一上电就进行初始化这是我们不需要关心的,我们要做的是在7810ns进行一次刷新操作就行了。所做的读和写就是在两次刷新间隔内进行的,这个会在下一节讲到。
全栈程序员站长
2022/07/28
4260
SDRAM控制器设计(数字控制器的两种设计方法)
Laravel 控制器:从 MVC 模式聊起
到目前为止,我们定义的所有路由都是基于闭包函数实现的,前面已经提到过,随着应用体量的增长,不可能将所有路由都定义在单个文件中,且对于复杂的业务逻辑,闭包函数也不足以支撑,所以和其他 Web 应用框架一样,我们还可以通过控制器来定义路由。
学院君
2020/10/19
11.3K0
Laravel 控制器:从 MVC 模式聊起
K8s节点故障:资源控制器会触发哪些动作
定义:在Kubernetes中,不可达节点被称为分区节点partitioned node,为了了解操作方法,让我们创建一个分区节点方案并了解其行为。
公众号: 云原生生态圈
2020/11/10
2.3K0
K8s节点故障:资源控制器会触发哪些动作
闭包是更好的对象---从Reload配置说起
如果项目中,到处用了一个全局对象的指针,那一定是很糟糕的. 我们假设这个对象就是Conf,也就是全局配置. 现在要改进代码,实现Reload Conf. 建议以下的改法:
Linker
2019/03/12
4020
闭包是更好的对象---从Reload配置说起
点击scrollview释放键盘触发touchesBegan方法
scrollView 本身继承 了 touch 的响应 事件,要从新自定义 scrollView 的 响应事件。
全栈程序员站长
2022/09/15
4320
pycharm添加pip指令安装库的方法[通俗易懂]
我们在cmd命令窗口通过pip指令安装的python第三方库,在使用pycharm的时候并不能直接使用,需要通过配置与python3.8 pip指令的外部库相连接。
全栈程序员站长
2022/09/25
2.3K0
pycharm添加pip指令安装库的方法[通俗易懂]
UIScrollView解决touchesBegan等方法不能触发的解方案[通俗易懂]
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
全栈程序员站长
2022/09/15
5310
压缩微指令长度方法
压缩微指令长度 1. 改直接表示为编码表示(压缩互斥性微指令) --- 互斥性微命令 - 输出信号不能同时为 1 XXX(out) - 运算器的 +1, ADD, SUB 信号也不能同时给出 7 个out型命令有7 个状态 --> 3:8译码器 - 所有输出里面一定有一个为高电平,所以 000 不用 - 预留的一个状态表示什么信号也不给 加法类的运算器信号 --> 2:4译码器 - +1,ADD, SUB - 无信号 缩短了微指令长度,增加了硬件开销(3:8译码器,2:4译码器),硬
ruochen
2021/05/16
6820
压缩微指令长度方法
点击加载更多

相似问题

从指令触发视图的控制器函数

22

从指令中包装源元素的更好方法?

22

从指令AngularJs触发控制器作用域

24

从指令触发控制器中的$scope函数

30

从控制器调用指令方法

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文