javascript-改进AngularJS指令代码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-改进AngularJS指令代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3812字,纯文字阅读大概需要6分钟。
内容图文
![javascript-改进AngularJS指令代码](/upload/InfoBanner/zyjiaocheng/682/38d4c6d64fd4436abab83bc975f7023d.jpg)
我写了一个AngularJS指令,但是我对此很陌生,而且我不知道我是否以“ Angular方式”完成…
这是我的代码为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: function($scope, elem, attrs){ /* do something w. elem */ }
在控制器中访问元素不是很容易.这就是链接的重点.编译指令对象的功能….
…但是在极少数情况下,这是有道理的.在控制器中注入的$element引用了angular.element(document.querySelector(‘[wait-button =“’id’”]’))代码正在做的事情.此时,您只需要使用$element即可.但是,我是否可以建议一种完全角度化的方法?
沟通之间控制器和指令
另一个问题是,您基本上是如何从指令向主控制器再回到指令传达您的意图的.您的用例与大多数情况有些不同,因为您具有异步性质.
我举了一个利用隔离范围和回调参数的示例.在大多数实际场景中,您将处理异步回调的承诺.这样,我使用了来自promises的.finally逻辑来执行回调,该回调传递回任何异步逻辑都已结束的指令.
在我的示例中要记住的事情:
>我使用coffeescript是因为我以这种方式明智地编码
>我使用CSS / DOM来驱动指令的加载状态如何显示,而不是尝试以编程方式进行.在我的书中,编程式DOM操作非常抗NG.指令为您提供了足够的方式来声明性地执行此操作.
>我没有使用指令控制器,因为除非您要为指令使用模板,否则您实际上不需要自定义控制器.当您使用链接功能与自定义指令控制器时,存在一条模糊的界限.
>哦…,我使用了* controller as?语法,因为如果您了解NG的发展方向,那么它们将远离整个$scope范式.
塞子-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
实现UI
<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})
内容总结
以上是互联网集市为您收集整理的javascript-改进AngularJS指令代码全部内容,希望文章能够帮你解决javascript-改进AngularJS指令代码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。