Skip to content

Commit 75c999d

Browse files
author
Stan Bondi
committed
Change directive to work in a more angular way
1 parent 2280ba4 commit 75c999d

File tree

2 files changed

+69
-79
lines changed

2 files changed

+69
-79
lines changed

demo/demo.html

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,27 @@
44
<meta charset="UTF-8">
55
<title>Angular ZeroClipboard</title>
66
<script src="../bower_components/angular/angular.js"></script>
7-
<script src="../bower_components/zeroclipboard/ZeroClipboard.min.js"></script>
7+
<script src="../bower_components/zeroclipboard/ZeroClipboard.js"></script>
88
<script src="../src/angular-zeroclipboard.js"></script>
99
<script>
10-
angular.module('demo', ['angular.zeroclipboard']).
10+
angular.module('demo', ['zeroclipboard']).
1111
config(['uiZeroclipConfigProvider', function(uiZeroclipConfigProvider) {
1212

1313
// config ZeroClipboard
1414
uiZeroclipConfigProvider.setZcConf({
1515
moviePath: '../bower_components/zeroclipboard/ZeroClipboard.swf'
1616
});
1717

18-
// set directive options
19-
uiZeroclipConfigProvider.setOptions({
20-
buttonText: 'Copy Me!',
21-
emitEvent: true
22-
});
23-
2418
}]).
2519
controller('demoCtrl', ['$scope', function($scope) {
26-
$scope.$on('ZeroClipboard.complete', function() {
27-
console.log('copy complete');
28-
})
20+
$scope.complete = function(e) {
21+
console.log('copy complete', e);
22+
$scope.copied = true
23+
};
24+
25+
$scope.$watch('input', function(v) {
26+
$scope.copied = false
27+
});
2928
}]);
3029
</script>
3130
</head>
@@ -34,10 +33,12 @@
3433
<h1>Angular ZeroClipboard Demo</h1>
3534

3635
<form action="">
37-
<label for="">input: <input type="text" ui-zeroclip ng-model="input"></label>
36+
<label for="">input: <input type="text" ng-model="input" id="input1"></label>
37+
<button ui-zeroclip zeroclip-copied="complete($event)" zeroclip-model="input" >Copy</button>
38+
<span ng-show="copied">Copied!</span>
3839

39-
<label for="">textarea: <textarea cols="30" rows="10" ui-zeroclip ng-model="textarea"></textarea></label>
40+
<label for="">textarea: <textarea cols="30" rows="10" ui-zeroclip zeroclip-value-"textarea" ng-model="textarea"></textarea></label>
4041
</form>
41-
42+
4243
</body>
43-
</html>
44+
</html>

src/angular-zeroclipboard.js

Lines changed: 53 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,65 @@
1-
angular.module('angular.zeroclipboard', []).
2-
provider('uiZeroclipConfig', function() {
1+
angular.module('zeroclipboard', [])
2+
.provider('uiZeroclipConfig', function() {
33
// default configs
44
var _zeroclipConfig = {
5-
buttonClass: '',
6-
moviePath: "ZeroClipboard.swf",
7-
trustedDomains: [window.location.host],
8-
cacheBust: true,
9-
forceHandCursor: false,
10-
zIndex: 999999999,
11-
debug: true,
12-
title: null,
13-
autoActivate: true,
14-
flashLoadTimeout: 30000,
15-
hoverClass: "zeroclipboard-is-hover",
16-
activeClass: "zeroclipboard-is-active"
17-
};
18-
var _options = {
19-
buttonClass: '',
20-
buttonText: 'Copy',
21-
emitEvent: false
5+
buttonClass: '',
6+
moviePath: "ZeroClipboard.swf",
7+
trustedDomains: [window.location.host],
8+
cacheBust: true,
9+
forceHandCursor: false,
10+
zIndex: 999999999,
11+
debug: false,
12+
title: null,
13+
autoActivate: true,
14+
flashLoadTimeout: 30000,
15+
hoverClass: "zeroclipboard-is-hover",
16+
activeClass: "zeroclipboard-is-active"
2217
};
2318
this.setZcConf = function(zcConf) {
24-
angular.extend(_zeroclipConfig, zcConf);
25-
};
26-
this.setOptions = function(options) {
27-
angular.extend(_options, options);
19+
angular.extend(_zeroclipConfig, zcConf);
2820
};
2921
this.$get = function() {
30-
return {
31-
zeroclipConfig: _zeroclipConfig,
32-
options: _options
33-
}
22+
return {
23+
zeroclipConfig: _zeroclipConfig
24+
}
3425
};
35-
}).
36-
directive('uiZeroclip', ['$document', '$window', 'uiZeroclipConfig',
37-
function($document, $window, uiZeroclipConfig) {
26+
})
27+
28+
.directive('uiZeroclip', ['$document', '$window', 'uiZeroclipConfig',
29+
function($document, $window, uiZeroclipConfig) {
30+
3831
var zeroclipConfig = uiZeroclipConfig.zeroclipConfig || {};
39-
var options = uiZeroclipConfig.options;
40-
var _id = 0;
32+
var ZeroClipboard = $window.ZeroClipboard
4133

42-
function insertAfter(newNode, referenceNode) {
43-
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
44-
}
4534
return {
46-
priority: 10,
47-
link: function(scope, elm, attrs) {
48-
// config
49-
ZeroClipboard.config(zeroclipConfig);
50-
var btn = elm[0];
51-
if (!attrs.id) {
52-
attrs.$set('id', 'uiZeroclip' + _id);
53-
btn = document.createElement('button');
54-
btn.appendChild(document.createTextNode(options.buttonText));
55-
btn.setAttribute('data-clipboard-target', 'uiZeroclip' + _id);
56-
btn.setAttribute('class', options.buttonClass);
57-
_id++;
58-
insertAfter(btn, elm[0]);
59-
}
60-
if (angular.isFunction(ZeroClipboard)) {
61-
scope.client = new ZeroClipboard(btn);
62-
}
63-
var _events = ['load', 'mouseover', 'mouseout', 'mouseup', 'mousedown', 'complete', 'dataRequested', 'noflash', 'wrongflash'];
64-
_events.forEach(function(evt) {
65-
if (options.emitEvent) {
66-
scope.client.on(evt, function() {
67-
scope.$emit('ZeroClipboard.' + evt);
68-
});
69-
} else {
70-
scope.client.on(evt, options[evt]);
71-
}
72-
})
35+
scope: {
36+
onCopied: '&zeroclipCopied',
37+
client: '=?uiZeroclip',
38+
value: '=zeroclipModel'
39+
},
40+
link: function(scope, element, attrs) {
41+
// config
42+
ZeroClipboard.config(zeroclipConfig);
43+
var btn = element[0];
44+
45+
if (angular.isFunction(ZeroClipboard)) {
46+
client = scope.client = new ZeroClipboard(btn);
7347
}
48+
49+
scope.$watch('value', function(v) {
50+
element.attr('data-clipboard-text', v);
51+
});
52+
53+
client.on('complete', function _completeHnd(e) {
54+
scope.$apply(function() {
55+
scope.onCopied({$event: e});
56+
});
57+
});
58+
59+
scope.$on('$destroy', function() {
60+
client.off('complete', _completeHnd)
61+
});
62+
}
7463
}
75-
}
76-
]);
64+
}
65+
]);

0 commit comments

Comments
 (0)