私は Dojo 1.7 を使用しており、2 つのタブがあります。あるタブのフィールドに設定されている値を、別のタブの別のフィールドに入力する必要があります。タブが1.7以降で開かれたときにjavascriptルーチンを実行する方法があることを覚えているようですが、私の人生では、これを行うためのパラメーターを見つけることができません。javascript を実行して dojo.byId を介して値を読み取ってから、他のタブに値を入力する予定です。これは、あるタブの値を別のタブの別のフィールドにバインドする簡単な方法を誰かが知っている場合を除きます。それは甘いでしょう!
いつものように、アドバイスをありがとう。ジャニー
2 に答える
単一のアドホック同期の場合、すべての dijit ウィジェット (より正確には をサブクラス化するすべてのクラス) で利用可能な mixinwatch
のメソッドを使用することをお勧めします。関数呼び出しでイベントをフックするのではなく、変更の値を監視できます。dojo/Stateful
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/
より複雑なケースについては、相互依存する Dojo ウィジェット/値を同期するための私の回答を参照し、実際の例を見てください: http://jsfiddle.net/phusick/HCx3w/
編集:元の質問に対する答えはdojo/aspect
、タブのContentPane
方法にあります_onShow
:
aspect.after(registry.byId("tab2"), "_onShow", function() {
console.log("#tab2 is now visible");
});
これを前述のjsFiddleに追加しました。
完全を期すために、次のように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'を双方向にする必要がある場合は、ウォッチ関数でミューテックスロックを作成する必要があることに注意してください。それ以外の場合、一方の入力がもう一方を設定します。他の人を監視すると一方が設定され、一方の入力の値を監視するともう一方の入力が再び設定されます。