2017-02-22 75 views
1

任何人都可以向我解釋爲什麼當drawSection被稱爲「這個」的價值成爲全球範圍?道場的要求和範圍

是否有反正在這裏使用require而不必在另一個變量保存widget之前我失去它?

define("my/TextBox", [ 
    "dojo/_base/declare", 
    "dijit/form/ValidationTextBox" 
], function(
declare, ValidationTextBox 
) { 

    function drawSection() { 
     alert(this); 
     require(["dojo/dom-construct"], function(domConstruct) { 
     alert(this); // this = window 
     }); 
    };  

    return declare([ValidationTextBox], { 
     postCreate: function() { 
      this.inherited(arguments);    
      drawSection.call(this) 
     } 
    }); 
}); 

回答

2

它退出使用簡單dojo/_base/langhitch()功能來解決這個問題。

因爲require(["dojo/dom-construct"], function(domConstruct) {....})內部的功能指的全球背景下,

所以用lang.hitch功能在目前情況下(通過使用this)和probleme解決

這裏是一個Fiddle

和以上工作片段:

define("my/TextBox", [ 
 
\t "dojo/_base/lang", 
 
    "dojo/_base/declare", 
 
    "dijit/form/ValidationTextBox" 
 
], function(lang, 
 
    declare, ValidationTextBox 
 
) { 
 

 
    function drawSection() { 
 

 
    alert(this); 
 

 
    require(["dojo/dom-construct"], lang.hitch(this,function(domConstruct) { 
 

 
     alert(this); // this = window 
 

 
    })); 
 

 
    }; 
 
    return declare([ValidationTextBox], { 
 
    postCreate: function() { 
 
     this.inherited(arguments); 
 
     drawSection.call(this) 
 
    } 
 
    }); 
 
    
 
}); 
 

 

 
require([ 
 
    "dojo/parser", 
 
    "my/TextBox", 
 
    "dojo/domReady!" 
 
], function(
 
    parser, 
 
    TextBox 
 
) { 
 
    
 
    // important: parse document after the ValidationTextBox was extended 
 
    parser.parse(); 
 
    
 
});
<link href="https://ajax.googleapis.com/ajax/libs/dojo/1.8/dijit/themes/claro/claro.css" rel="stylesheet"/> 
 
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script> 
 

 
<body class="claro"> 
 
<input type="text" data-dojo-type="my/TextBox" />, 
 
</body>

+0

感謝您的提示....爲什麼它恢復到全球範圍雖然? – blu10

+1

它需要調用者定義的作用域('require'),它是'window'' – ben

+0

就像ben說的那樣,然後'lang.hitch(this,function(){})'表示執行'this'中的函數參考當前類,如果我們聲明'lang.hitch(window,function(){})',它將在'window'範圍內執行而不是類。 –

0

您需要使用dojo/_base/langlang.hitch這樣的:

require(["dojo/dom-construct"], lang.hitch(this, function(domConstruct) { 

     alert(this); // this = window 

    })); 

這是一個常見的問題關閉。
https://dojotoolkit.org/reference-guide/1.10/dojo/_base/lang.html#hitch

作爲一個很好的做法,我會建議有小部件內drawSection方法和頂部所需的dom-construct(你永遠需要它,你從postCreate稱它爲所以「按需」要求是矯枉過正)

define("my/TextBox", [ 
     "dojo/_base/declare", 
     "dijit/form/ValidationTextBox", 
     "dojo/dom-construct" 
    ], function(declare, ValidationTextBox, domConstruct) { 

    return declare([ValidationTextBox], { 
     postCreate: function() { 
       this.inherited(arguments);    
       this.drawSection() 
     }, 
     drawSection: function() { 
       alert(this); 
       //domConstruct.whaever you want 
     }; 
    }); 
    });