在dojo中将数据从一个选项卡绑定到另一个选项卡(在选项卡打开?)

时间:2012-08-28 21:24:18

标签: javascript dojo

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

2 个答案:

答案 0 :(得分:2)

对于单个即席同步,我建议使用watch dojo/Stateful方法,这是一个可用于每个dijit小部件的mixin(更准确地说,是每个类dijit/_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

答案 1 :(得分: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函数中创建一个互斥锁。否则一个输入设置另一个。在其他设置上观看一个,同时在一个输入中观看值再次设置另一个,依此类推。