1

dojo deferred を使用した次のコードに似た問題が発生しています:-

これは XXX.js ファイルです

dojo.declare('XXX', [dijit._Widget, dijit._Templated], {

postCreate: function() {
  //getting deferred from somewhere
  var _this = this;
  deferred.then(function(response) {
      console.log("This is getting printed");
      _this.watch("value", function(A, B, C) {
        console.log("This is not getting printed");
        var value = _this.get("value");
        _this.onValueChange(value);
  });

}

私は次のコードでこのクラスフォームの他のJSファイルを呼び出します:-

this.object = new XXX({ 
                    //some args
                }
dojo.connect(this.object, "onValueChange", function(value) {
                    console.log("I am here");
                    this.onValueChange(value);
});

deferred.thenなしで同じ「watch」を使用していたときは、完全に正常に機能していましたが、フォームの値を変更すると関数が実行されません。ポインタはありますか?「this.object」が作成されたときに、遅延オブジェクトが「then」で関数を実行しなかったことが原因でしょうか?

4

1 に答える 1

0

ウォッチ ハンドラは、追加されたコンテキストから独立しています。それらは、それぞれのステートフル オブジェクトにフックされているだけです。上記のコードでは、watch ブロックのエンドブレース -})がありません。たぶん、それが問題です。以下の簡単な例を参照してください。

<script type='text/javascript'>
    dojo.require("dijit.form.TextBox");
    dojo.require("dojo._base.Deferred");
    dojo.require("dojo.ready");

    var def = null;

    dojo.ready(function(){
        def = new dojo._base.Deferred();
        var _this = dijit.byId('namefield');
        def.then(function(resp) {
          _this.watch("value",function(a,b,c) {
            console.info(''+a+'-'+b+'-'+c);
          });
        });
    });
    function func() {
        if(def) {
          def.resolve(true);
          console.info('resolved');
        }
    }
</script>
</head>
<body class="claro">
    <input type="text" dojoType="dijit.form.TextBox" id="namefield" name="namefield"/>
    <button onclick='func()'>click</button>
</body>

そのため、ウォッチ ハンドラーは、遅延コールバック内に追加された場合でも機能します。さらに、「onValueChange」のイベントハンドラー内から「onValueChange」が呼び出されていることがわかります。これは再帰的であり、stackoverflow エラーになります。また、「this」演算子は「dojo.connect」内で異なるコンテキストを持ちます。そこも気をつけてください。

于 2013-08-27T09:19:26.637 に答える