【发布时间】:2013-12-30 00:10:38
【问题描述】:
我正在考虑创建一个颜色选择器,以便从我的一个小部件中调用。用户单击一个按钮以调出颜色选择器并单击一种颜色,然后将其返回给调用小部件。
我想我需要创建一个延迟对象,它会以某种方式等到延迟解决。然后我可以将该颜色设置为调用小部件中的变量。不过,我很难把它包起来。
我的调用小部件有这样一个方法:
pickColor: function (e) {
Event.stop(e);
var colorPicker = new ColorWidget();
colorPicker.getColor().then(function (value) {
console.log(value);
});
}
我的 ColorWidget 将是创建延迟对象的那个,对吗?
define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dojo/text!./templates/ColorWidget.html",
"dojo/Deferred",
"dojo/_base/Color",
"dojo/dom-construct",
"dojo/domReady!"],
function (declare, _WidgetBase, _TemplatedMixin, template, Deferred, Color, domConstruct) {
return declare("ColorWidget", [_WidgetBase, _TemplatedMixin], {
templateString: template,
deferred: {},
color: {},
constructor: function () {
this.deferred = new Deferred();
},
postCreate: function () {
domConstruct.place(this.domNode, "color-picker-holder", "last");
},
pick: function (evt) {
this.color = new Color(evt.srcElement.id);
domConstruct.destroy(this.domNode);
this.deferred.resolve(this.color);
},
getColor: function () {
return this.deferred;
}
});
});
这只是我脑海中的一个想法,但这就是它的设计方式吗?我可能会在登录对话框中使用相同的想法,该对话框将停止初始化页面,直到成功验证。是这样吗?
编辑:我实际上走上了正轨。这行得通。
【问题讨论】:
-
我无法想象您为什么要将“延迟”用于颜色选择器之类的东西。但这是一个有趣的问题。我猜你可能对这两个教程很熟悉:Getting started with Deferreds 和 Dojo deferreds and Promises
-
是的,我看过那些。在用户选择一个小部件后,我很难想出一种更好的方法来调用小部件并从中获取值(到我的调用小部件中)。如果我立即调用 getColor() 并且它不是延迟的,它会立即返回 null。如果我离开了,一定要让我知道。感谢您的回复。
-
为什么不让颜色选择器小部件发布一个“datePicked”事件?调用小部件可以订阅此事件(使用 dojo/on, on(colorpickerWidget, "datePicked", function(){}))并使用它的值(可以作为事件的参数传递)。
-
这是一个更好的主意。我是 Dojo 的新手,所以我不熟悉它是如何发布/订阅的。在我走这条路之前,我做了谷歌“dojo observable”……没走多远。我去看看,谢谢。
-
看起来他们的发布/订阅系统已被弃用,取而代之的是集中式“主题”中心。还是值得一看的。
标签: javascript dojo deferred