【发布时间】:2023-03-17 12:55:01
【问题描述】:
在使用新组件时遇到了一个非常奇怪的问题。当我们有一个 1.4 指令时,我们有以下代码......
(function () {
'use strict';
angular.module('app.board').directive('dcCb', dcClipboardCopy);
function dcCb() {
return {
link : function(scope, elem) {
var clipboard = new Clipboard(elem[0]);
elem.on('$destroy', function() {
clipboard.destroy();
});
}
};
}
})();
clipboard.destroy() 函数内部如下...
Clipboard.prototype.destroy = function(){
this.listeners.destroy();
}
在 1.4 中this 与元素相同,所以...
<button class="btn btn-sm btn-menu-outline copy-button" ...
所以这很好用,因为按钮元素似乎具有可以调用的 listeners 属性。
但是在升级到 1.5 之后,现在我们有了这样的组件....
(function() {
'use strict';
angular.module('app.board').component('dcCb', {
...
controller: [ '$element','$scope',function($element,$scope) {
var self = this;
self.$postLink = postLink;
function postLink(){
var clipboard = new Clipboard($element[0]);
...
$element.on('$destroy', clipboard.destroy);
}
}]
});
})();
this(在剪贴板的销毁函数中)现在是控制器对象。所以尝试调用this.listeners 会引发错误。
第一个问题:
我知道新组件中的this 是组件范围,但在 1.4 中它是按钮元素。当然在这两个按钮元素中都应该是$element?我们在 1.4 中做错了吗?
第二个问题:
var clipboard = new Clipboard($element[0]) 不应该强制剪贴板中this 的上下文始终是剪贴板本身(由于new 关键字)?
【问题讨论】:
-
有点困惑;您实际上是在使用 .component('name', {}) 语法并将链接函数中的内容移动到组件控制器吗?或者当您说“1.5 中的组件”时,您指的是其他东西?
-
代码已更新.....是的,我们现在使用的是 .component 函数而不是指令函数。
-
你在升级后的版本中使用了非常不同的功能......当然你失去了
this。在 1.4 中,您使用匿名函数避免了这种情况。 -
仅仅因为您创建了一个类的实例并不意味着当您将作为该实例一部分的函数传递给其他地方时它会保持上下文。任何东西都可以使用 .call 或 .apply 重新绑定它。事件处理程序总是这样做。
标签: javascript angularjs this