Dojo class 事件侦听器在后续实例化时消失
Dojo class event listener disappears upon subsequent instantiation
我有一个名为 Draggable 的简单 class,它有一个 Moveable 和一个点击事件侦听器:
define([
'dojo/dom',
'dojo/query',
'dojo/dom-style',
'dojo/dnd/Moveable',
'dojo/_base/declare'
], function(
dom,
query,
domStyle,
Moveable,
declare
){
return declare(null, {
constructor: function(id){
this.id = id;
dom.byId('draggables').innerHTML +=
'<div id="' + id + '" style="width: 100px; height: 100px; border: 1px solid #000;"></div>';
this.moveable = new Moveable(id, {
handle: dom.byId(id)
});
query('#' + id).on('click', function(){ console.log(id); });
}
});
});
在主 HTML 文件 index.html 中,我简单地创建了两个 Draggable 实例,A 和 B:
<script>
require([
'dojo',
'dojo/query',
'extras/Draggable'
], function(
query,
Draggable
){
var a = new Draggable('A');
var b = new Draggable('B');
});
</script>
如果我单独创建了 Draggable A(没有创建 Draggable B),我可以拖动 Draggable A,每当我点击它时,控制台都会按预期记录 "A"。
但是,一旦我创建了 Draggable A 和 B(如代码所示),只有 Draggable B 可以拖动,只有当我点击 Draggable B 时,控制台才会显示 "B"。似乎在创建 Draggable B 的那一刻,Draggable A 失去了它的 Moveable 和它的事件侦听器!
嗯,你最好走另一条路。可移动 class 设计,因此您不能将其用作小部件中的混合。它的构造函数需要一个节点作为参数,而模板化的小部件此时没有节点,除了 srcNodeRef,如果它被传递的话。
因此,我建议您执行以下操作:
1 创建没有 Movable 的模板化小部件 class。如果需要,附加事件侦听器。如果您正确使用 data-dojo-attach-event 属性或您喜欢的任何其他方式,它将开箱即用而不会发生任何冲突。
小部件的代码可能如下所示:
define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin"
], function (
declare,
_WidgetBase,
_TemplatedMixin
) {
"use strict";
return declare("Draggable", [_WidgetBase, _TemplatedMixin], {
templateString: "<div data-dojo-attach-event='click: clickHandler' style='width: 100px; height: 100px; border: 1px solid #000'>draggable div</div>",
clickHandler: function (e) {
console.log("Clicked:", this.id, e);
}
});
});
2 您将在页面的某处创建小部件并使其可移动,例如:
<script>
require(["dojo/dnd/Moveable", "Draggable"], function (Movable, Draggable){
let d1 = new Draggable();
d1.placeAt("myContainer");
let d2 = new Draggable();
d2.placeAt("myContainer");
let m1 = new Movable(d1.domNode);
let m2 = new Movable(d2.domNode);
});
</script>
<div id="myContainer"></div>
我已经测试过了,它对我有用。希望对你有帮助;
我有一个名为 Draggable 的简单 class,它有一个 Moveable 和一个点击事件侦听器:
define([
'dojo/dom',
'dojo/query',
'dojo/dom-style',
'dojo/dnd/Moveable',
'dojo/_base/declare'
], function(
dom,
query,
domStyle,
Moveable,
declare
){
return declare(null, {
constructor: function(id){
this.id = id;
dom.byId('draggables').innerHTML +=
'<div id="' + id + '" style="width: 100px; height: 100px; border: 1px solid #000;"></div>';
this.moveable = new Moveable(id, {
handle: dom.byId(id)
});
query('#' + id).on('click', function(){ console.log(id); });
}
});
});
在主 HTML 文件 index.html 中,我简单地创建了两个 Draggable 实例,A 和 B:
<script>
require([
'dojo',
'dojo/query',
'extras/Draggable'
], function(
query,
Draggable
){
var a = new Draggable('A');
var b = new Draggable('B');
});
</script>
如果我单独创建了 Draggable A(没有创建 Draggable B),我可以拖动 Draggable A,每当我点击它时,控制台都会按预期记录 "A"。
但是,一旦我创建了 Draggable A 和 B(如代码所示),只有 Draggable B 可以拖动,只有当我点击 Draggable B 时,控制台才会显示 "B"。似乎在创建 Draggable B 的那一刻,Draggable A 失去了它的 Moveable 和它的事件侦听器!
嗯,你最好走另一条路。可移动 class 设计,因此您不能将其用作小部件中的混合。它的构造函数需要一个节点作为参数,而模板化的小部件此时没有节点,除了 srcNodeRef,如果它被传递的话。
因此,我建议您执行以下操作:
1 创建没有 Movable 的模板化小部件 class。如果需要,附加事件侦听器。如果您正确使用 data-dojo-attach-event 属性或您喜欢的任何其他方式,它将开箱即用而不会发生任何冲突。 小部件的代码可能如下所示:
define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin"
], function (
declare,
_WidgetBase,
_TemplatedMixin
) {
"use strict";
return declare("Draggable", [_WidgetBase, _TemplatedMixin], {
templateString: "<div data-dojo-attach-event='click: clickHandler' style='width: 100px; height: 100px; border: 1px solid #000'>draggable div</div>",
clickHandler: function (e) {
console.log("Clicked:", this.id, e);
}
});
});
2 您将在页面的某处创建小部件并使其可移动,例如:
<script>
require(["dojo/dnd/Moveable", "Draggable"], function (Movable, Draggable){
let d1 = new Draggable();
d1.placeAt("myContainer");
let d2 = new Draggable();
d2.placeAt("myContainer");
let m1 = new Movable(d1.domNode);
let m2 = new Movable(d2.domNode);
});
</script>
<div id="myContainer"></div>
我已经测试过了,它对我有用。希望对你有帮助;