0

我一直在使用 dojo 1.7 并且有两个选项卡。我在一个选项卡的字段中设置了一个值,该值需要进入另一个选项卡上的另一个字段。我似乎记得有一种方法可以在 1.7+ 中打开选项卡时执行 javascript 例程,但在我的一生中,我无法找到执行此操作的参数。我计划执行 javascript 以通过 dojo.byId 读取值,然后将值填充到另一个选项卡中。除非有人知道将一个选项卡中的值绑定到另一个选项卡中的另一个字段的更简单方法。那将是甜蜜的!
像往常一样,感谢您的建议。珍妮

4

2 回答 2

2

对于单个 ad hoc 同步,我建议使用每个 dijit 小部件(更准确地说是子类的每个类)都可用的 mixinwatch方法。它允许监视更改的值,而不是在函数调用上挂钩事件。dojo/Statefuldijit/_WidgetBase

var spinner1 = registry.byId("spinner1")
, spinner2 = registry.byId("spinner2")
;

spinner1.watch("value", function(prop, oldValue, newValue) {
    spinner2.set("value", newValue);
});

在 jsFiddle 上查看它的实际效果:http: //jsfiddle.net/phusick/YyNCk/

对于更复杂的情况,请参阅我对Synchronize interdependent Dojo widgets/values的回答并查看一个工作示例:http: //jsfiddle.net/phusick/HCx3w/

编辑:你原来的问题的答案是dojo/aspect选项卡的ContentPane方法_onShow

aspect.after(registry.byId("tab2"), "_onShow", function() {
    console.log("#tab2 is now visible");
});

我将此添加到上述jsFiddle

于 2012-08-29T08:27:36.577 回答
0

为了完整起见,您可以像这样轻松使用 phusick 的答案:

require(
   ["dojo/_base/declare", "dijit/form/NumberSpinner"], 
   function (declare, Spinner ) 
   {
        declare("my.spinner", [dijit.form.NumberSpinner], {
            linkedInputs: [],
            startup: function() {
                var self = this;
                if(this.linkedInputs) {
                     self.watch("value", dojo.hitch(self, self.setOther));
                }

                return this.inherited(arguments);
            },
            setOther: function() {
                var links = this.linkedInputs, newVal= self.get("value")
                dojo.ready(function() {
                  dojo.forEach(links, function(input) {
                      /*assert if string*/ dijit.byId(input).set("value", newVal);
                  });
                });
            }
        });
});

请注意,如果您需要一个双向的“linkedInput” - 您需要在 watch 函数中创建一个互斥锁。否则,一个输入设置另一个。Watch on other sets the one,同时观察一个输入中的值再次设置另一个,依此类推。

于 2012-08-29T08:54:01.257 回答