改进 AngularJS 指令代码

2024-02-02

我写了一个 AngularJS 指令,但我对它还很陌生,我不知道我是否以“Angular 方式”完成......

这是我的代码:http://plnkr.co/edit/X1tOk4z8f6dCK3mfB7HP?p=preview http://plnkr.co/edit/X1tOk4z8f6dCK3mfB7HP?p=preview

html:

<!DOCTYPE html>
<html ng-app="app">

<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<meta charset=utf-8 />
<title>Directive Test</title>
<script src="script.js"></script>
</head>

<body ng-controller="MainCtrl">

  <button id="button1" ng-click="dummyClickFoo()" wait-button="foo"><i></i> Foo</button>
  <button id="button2" ng-click="dummyClickBar()" wait-button="bar"><i></i> Bar</button>

</body>

</html>

js:

app = angular.module('app', []);

app.controller('MainCtrl', function($scope) {
    $scope.dummyClickFoo = function() {
        $scope.startSpinner('foo');

        setTimeout(function() {
                $scope.stopSpinner('foo');
          }, 3000);
    };

    $scope.dummyClickBar = function() {
        $scope.startSpinner('bar');

        setTimeout(function() {
                $scope.stopSpinner('bar');
          }, 3000);
    };
});


app.directive('waitButton', function() {
    return {
        restrict: 'A',
        controller: ['$scope', '$element', function($scope, $element) {
            $scope.startSpinner = function(id) {
                var el = angular.element(document.querySelector('[wait-button="'+id+'"]'));
                el.children('i').text('searching...');
            };

            $scope.stopSpinner = function(id) {
                var el = angular.element(document.querySelector('[wait-button="'+id+'"]'));
                el.children('i').empty();
            };
        }]
    };
});

我发现document.querySelector('[wait-button="'+id+'"]')部分,它有点“令人讨厌”......(或者不是?);否则我不知道在同一控制器中不同时间重复使用同一指令的更好方法。 有人可以建议我更好的代码吗?

谢谢。


访问指令中的元素

我建议使用link此类事物的函数:

link: function($scope, elem, attrs){ /* do something w. elem */ }

这不是很有角度的访问控制器中的元素。这就是整个要点link & compile指令对象的功能....

...但在极少数情况下这是合理的。注射的$element在你的控制器中引用同样的东西angular.element(document.querySelector('[wait-button="'+id+'"]'))代码正在做。你只需要使用$element在此刻。但我可以推荐一种更有角度的方法吗?

之间的沟通。控制器和指令

另一个问题是您如何基本上将您的意图从指令传达到主控制器并返回指令。您的用例与大多数用例略有不同,因为您具有异步性质。

我制作了一个利用隔离范围和回调参数的示例。在大多数现实场景中,您将处理异步回调的承诺。因此,我使用了.finally来自承诺执行回调的逻辑,该回调与任何异步逻辑已包装的指令进行通信。

在我的例子中要记住的事情:

  • 我使用咖啡脚本,因为我这样编码
  • 我用CSS/DOM来驱动how the loading指令的状态应该出现,而不是尝试以编程方式执行。在我的书中,程序化的 DOM 操作是非常反对NG的。指令为您提供了足够的功能来以声明方式执行此类操作。
  • 我没有使用指令控制器,因为除非您要为指令使用模板,否则您实际上不需要自定义控制器。当你去的时候有一条模糊的线link函数与自定义指令控制器。
  • 哦...我使用了 *controller as• 语法,因为如果你读到任何有关 NG 走向的内容,他们就会远离整个整体$scope范例。

笨蛋-http://plnkr.co/edit/0AvlCQW5qqkpYKl2WpB3?p=preview http://plnkr.co/edit/0AvlCQW5qqkpYKl2WpB3?p=preview

声明式用户界面

主控制器

.controller 'MainCtrl', class MainCtrl
  @$inject = [
    '$scope'
    '$interval'
  ]

  constructor: ($scope, @$interval)->
    @viewData = 'Skynet 2.0'
    @isLoading = false

  callbackExample: ($callbackFunc)->
    @loadRqst()
    .finally -> $callbackFunc?()

  loadRqst: ->
    @isLoading = 1
    # this returns a promise which gets processed in the example functions
    @$interval => 
      console.log @isLoading++
    , 250, 10 
    .finally => 
      @isLoading = false

实施用户界面

<button callback-btn="vc.callbackExample($callbackFunc)">
  Callback Example<i> - I'm loading & I'm #1</i>
</button>

<button callback-btn="vc.callbackExample($callbackFunc)">
  Callback Example<i> - Look I can load too, I'm #2</i>
</button>

css

[callback-btn] i{
  display: none;
}

[callback-btn].loading i{
  display: initial;
}

该指令

.directive 'callbackBtn', ($parse)->
  dir =
    restrict: 'A' 
    scope: { callbackBtn: '&' }
    link: ($scope, elem, attrs)->

      onCallback = ->
        console.log 'on callback'
        elem.removeClass 'loading'

      elem.on 'click', ->
        elem.addClass 'loading'
        $scope.$apply ->
          $scope.callbackBtn({$callbackFunc: onCallback})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改进 AngularJS 指令代码 的相关文章

  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • 如何在量角器中模拟拖放动作?

    我有一个双滑块 我想测试它是否可操作并返回正确的数据 滑块有一个最小和一个最大处理程序 它还有一些 我可以挂钩的断点 我想要模拟的是 handler max 元素的 touchStart 将拇指移动到类为 step 3 的元素上 handl
  • 如何在没有 jQuery 的情况下删除 Javascript 中的元素

    我试图通过以下方式从 DOM 中删除 Div a 标签嵌套在其中 我想我正在寻找的是 jQuery 的纯 Javascript 版本 div remove 这是html设置 div a href Click me to remove the
  • jQuery .push 到 .get 调用中的数组给出空结果

    谁能告诉我为什么下面给我一个空字符串 当我console log contentArray in the get 回调函数它显示数据 但是当我尝试在下面的代码中执行它时 结果为空 sectionArray contentArray func
  • Number.IsNaN() 比 isNaN() 更糟糕吗

    Soooooo isNaNJavaScript 显然被破坏了 比如 isNaN isNaN isNaN true isNaN false isNaN 0 返回 false 当它们看起来都是 不是数字 在 ECMAScript 6 中 草案包
  • 想要动态处理与分页相关的页码显示:ReactJS

    我有一些分页逻辑工作得很好 唯一的问题是我只能让它显示并固定数量的页面可供选择 现在我已经把它放到了 5 页 但我希望它能够根据总记录动态更改 假设我有 100 条记录 每页限制为 10 条 将有 10 页 现在我只能让它以这种方式显示 第
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • $exceptionHandler 中的 $location - 依赖冲突

    我正在尝试实现一个非常标准的任务 当发生异常时 重定向到我的 error page 代码的简化形式如下所示 app factory exceptionHandler location function location return fun
  • React Router v4 不渲染组件

    React Router v4 渲染组件存在问题 在应用程序初始加载时 它将呈现与 URL 相对应的正确组件 但是 任何后续的组件Link单击不会呈现所需的组件 图书馆 反应路由器 4 2 2 https reacttraining com
  • JavaScript推送函数中的动态变量

    我在 JavaScript 中使用推送功能 var chartData for var i 0 i lt 3 i chartData push date new Date year s mon s date s hr s min s sec
  • IE 中的 XPath 查询使用从零开始的索引,但 W3C 规范是从一开始的。我应该如何处理差异?

    问题 我正在转换目前仅适用于 Internet Explorer 的相对较大的 Javascript 代码 以便使其也适用于其他浏览器 由于代码广泛使用 XPath 我们做了一些兼容性功能以使事情变得更容易 function selectN
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 在 Angular 中让多个调用等待同一个 Promise

    我在一个页面上有多个使用相同服务的控制器 为了举例 我们将服务称为 USER 第一次调用 USER getUser 时 它会发出 http 请求来获取有关用户的数据 调用完成后 它将数据存储在 USER data 中 如果再次调用 USER
  • Google Maps API (v3) 添加/更新标记

    编辑 它现在可以工作 但如果用户不允许或没有基于位置的服务 则不会加载 请参阅 jsfiddle 示例接受的答案评论 我已经浏览了一些教程和问题 但我无法安静地理解正在发生的事情 或者在这种情况下 没有发生 当用户单击链接时 我正在加载地图
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下

随机推荐

  • 在 tomcat servlet 中检测客户端断开连接?

    如何检测 tomcat servlet 请求的客户端已断开连接 我读到我应该执行一个response getOutputStream print 然后执行一个response getOutputStream flush 并捕获一个IOExc
  • 仅因(互斥)要求子句的差异而导致隐藏好友的超载:合法还是违反 ODR?

    考虑以下类模板 其中包含两个 隐藏的 友元声明同一个朋友的 same 功能类型 见下文 它也定义了友元 因此友元是内联的 但定义条件为 互斥 要求子句 include
  • 警告 C4661:没有为显式模板实例化请求提供合适的定义

    我编写了一个类模板并在不同的 DLL 中使用它 因此希望隐藏实现的某些部分 为此 我使用 模板实例化 但将其导出 如下所示 这是头文件 include
  • MVC Actionlink 和 Bootstrap 模态提交

    我正在开发一个 MVC 5 Web 应用程序 在我的一个 Razor 视图中 我有一张表 其中显示了几行数据 每行数据旁边都有一个删除按钮 当用户单击删除按钮时 我希望弹出 Bootstrap Modal 并要求用户确认删除 foreach
  • XTend 的命令行编译器

    Hi all我找到了 XTend http xtend lang org 它听起来确实很棒 但是 我看不到这种语言的任何独立命令行编译器 好像只能在eclipse下运行 我做了一些研究 发现有人说它有一个命令行编译器 但我找不到下载链接 编
  • 绘制折线时某些设备上出现奇怪的 ArrayIndexOutOfBoundsException

    下面是我用来绘制路线的代码 每当用户暂停锻炼时 我想将此路径显示为粉红色折线 因此我制作了自己的界面 名为MapHelper并将一个布尔值作为isPause and lastPause 当用户保存他 她的锻炼时 我将所有路线点保存为数组 并
  • 是否有适用于 Windows 平台的轻量级、可编程 Sandbox API? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 为了在家运行不受信任的代码 我使用 VMWare 虚拟机 我想找到一个替代的轻量级沙箱 API 来运行
  • 在 Android 中从一项活动转移到另一项活动

    以下是我的代码 请告诉我我做错了什么 package version nitt import android app Activity import android os Bundle import android view View im
  • 如何最好地在 WiX 中定义自定义操作?

    我有一个WiX http en wikipedia org wiki WiX安装程序和一个自定义操作 加上撤消和回滚 它使用安装程序的属性 自定义操作必须在所有文件都位于硬盘上之后发生 为此 您似乎需要 WXS 文件中的 16 个条目 根内
  • 下拉当前索引 onchange

    有一个包含 5 个选项的下拉菜单 当前 选择了选项 2 用户现在选择了选项 4 onchange 事件被触发 该事件被 JS 函数捕获 监听选择上的 onchange 在 JS 函数中 我可以使用以下命令轻松检查用户选择的选项的索引选定索引
  • 使用注释移动 Google 图表列注释位置:线

    使用下面的示例 是否可以移动注释 以便在使用时它们全部出现在图表底部的相同 静态 位置style line 这使得注释垂直阅读 google charts load current callback function drawChart w
  • 我可以向现有 ATL COM 项目添加 MFC 支持吗

    我使用 ATL COM Object 创建了一个 Shell 扩展 但在创建过程中我没有添加MFC支持 我现在可以更改设置以添加 MFC 支持吗 是的 但我相信这样做不会自动添加所有必需的标头和 defines 当然 您可以先尝试此操作 然
  • 在 python 中使用时区获取当前时间?

    我正在使用 Google App Engine 和 python 而且我无法安装第三方库 我认为这应该可行 但它实际上运行没有错误 但它返回当前时区未应用 我做错了什么 from datetime import tzinfo timedel
  • 图例中的刻度尺寸符号

    我绘制了一个气泡图 http www r bloggers com wp content uploads 2010 12 bubbleChart png圆圈的大小对应于使用 matplotlib 的值列表 但是 我在为具有与列出的大小相对应
  • 从字符串中分割货币和金额

    我正在导入一个包含不同货币符号的金额的文件 12 10 26 13 12 50 我需要将其导入并转换为单一货币 我将字符串拆分如下 parts split preg replace 0 9 1 amount 1 无法使 preg split
  • Android中文件、类和活动之间的区别

    Android中的文件 类和活动有什么区别 文件 它是任意信息块或用于存储信息的资源 它可以是任何类型 类 它是 Java 文件的编译形式 Android最终使用这个 class文件生成可执行的apk 活动 活动相当于 GUI 工具包中的框
  • 禁用 Django 中特定应用程序的本地化

    有没有办法在 Django 设置中禁用特定应用程序的本地化 造成这种情况的可能原因有两个 关闭管理应用程序 例如 contrib admin 中的本地化 因为管理员更喜欢使用英语而不是本地语言 一些应用程序的默认翻译确实很糟糕且令人困惑 我
  • React 16:使用钩子和功能组件时从父级调用子级函数

    我需要在父组件中调用子组件的函数 我该怎么做呢 之前在 React 15 中 我可以使用 refs 来调用子函数 但不知道如何使用钩子和功能组件来做到这一点 function Child props function validate to
  • 如何将验证器与 QTableWidgetItem 一起使用?

    假设我有一个 QTableWidgetItem 项目 我只想验证用户输入的数据 例如 用户仅在该项目中输入数字 否则程序将显示警告对话框 我也搜索该文档页面 http harmattan dev nokia com docs library
  • 改进 AngularJS 指令代码

    我写了一个 AngularJS 指令 但我对它还很陌生 我不知道我是否以 Angular 方式 完成 这是我的代码 http plnkr co edit X1tOk4z8f6dCK3mfB7HP p preview http plnkr c