2017-02-22 4 views
1

Kann mir jemand erklären warum, wenn drawSection heißt 'dieser' Wert wird der globale Geltungsbereich?.dojo require und scope

Ist es sowieso erforderlich hier zu verwenden, ohne das Widget in einer anderen Variablen speichern zu müssen, bevor ich es verliere?

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) 
     } 
    }); 
}); 

Antwort

2

Es ist recht einfach Gebrauch dojo/_base/langhitch() Funktion um das Problem zu lösen.

, da die Funktion innerhalb der require(["dojo/dom-construct"], function(domConstruct) {....}) für globalen Kontext beziehen,

so lang.hitch Funktion im aktuellen Kontext verwendet (von this verwenden) und Problemen gelöst

hier ein Fiddle

ist und über Arbeits Schnipsel:

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

danke für den tip .... wieso kommt es hier wieder zum globalen umfang? – blu10

+1

es dauert den vom Aufrufer definierten Umfang ('require'), was' window' ist. – ben

+0

Genau wie gesagt, dann bedeutet 'lang.hitch (this, function() {})' die Funktion in 'this' auszuführen beziehen sich auf die aktuelle Klasse, in einem anderen Begriff, wenn wir erklären 'lang.hitch (window, function() {})' es wird im Bereich von 'window' nicht die Klasse ausführen. –

0

Sie benötigen dojo/_base/langlang.hitch wie folgt zu verwenden:

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

     alert(this); // this = window 

    })); 

, dass ein gemeinsames Schließ Problem.
Siehe https://dojotoolkit.org/reference-guide/1.10/dojo/_base/lang.html#hitch

Als gute Praxis, ich habe die drawSection Methode innerhalb des Widgets mit würde empfehlen, und die dom-construct oben erforderlich (Sie müssen es immer, wie Sie es von postCreate nennen so ein „on-demand“ benötigen, ist Overkill)

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 
     }; 
    }); 
    });