Dojo:如何将onchange处理程序连接到用xhr加载的对话框中的选择框?

时间:2012-04-01 18:06:52

标签: ajax dialog dojo

这可能很明显,但我无法弄清楚如何完成它。

我有一个使用href填充数据的Dojo对话框。

var newDialog = new Dialog({
  title: 'Here is my dialog',
  style: 'width: 50%',
  href: 'path/to/content/script'
});

当用户点击按钮时会显示该对话框:

var showDialog_button = new Button({
  label: "Create new scrum",
  onClick: function(){
    newDialog.show();
    dojo.connect(dojo.byId('select1'), 'onChange', select1_onchange);
  }
}, 'button_id');

该对话框包含几个需要连接的选择框:当其中一个选择了一个选项时,另一个选项也需要更改(一个包含一个组列表,另一个包含一个成员列表)该组的 - 所以当选择组X时,另一个选择应该只显示X的成员。

但问题是,因为我异步加载对话框,所以在对话框加载完成之前,我最终会尝试连接onchange处理程序。

如何在对话框加载后等待?我曾尝试调用newDialog.startup以便立即加载对话框,但这似乎对我没有帮助。

帮助任何人?

2 个答案:

答案 0 :(得分:1)

dialog.show()方法返回一个dojo.Deferred,它在显示动画完成时解析。

因此,您可以使用dojo.when或dojo.then完成对话框完成渲染后需要完成的任何操作。

在你的例子中,这样的事情应该有效:

var connectEvent = null; 

var showDialog_button = new Button({
    label: "Create new scrum",
    onClick: function(){
        newDialog.show().then(function(){
            connectEvent = dojo.connect(dojo.byId('select1'), 'onChange', select1_onchange);
        }
    }
}, 'button_id');

// and later on, when the event is no longer needed...
connectEvent && dojo.disconnect(connectEvent);

或者,你可以使用dojo 1.7.2的dijit/on来改善它,使用如下语法:

showDialog_button.on("click", function(response) {
    var onShowEvt = dialog.on("show", function(e) { 
        onShowEvt.remove();
        // Connect your other events here
    });
});

答案 1 :(得分:0)

在连接对话框之前,您需要等待对话框打开:

var showDialog_button = new Button({
    label: "Create new scrum",
    onClick: function(){
        newDialog.show();
        var showHandle = dojo.connect(newDialog, 'onShow', function () {
            dojo.disconnect(showHandle);
            dojo.connect(dojo.byId('select1'), 'onChange', select1_onchange);
        });
    }
}, 'button_id');