2016-09-06 3 views
1

Ich versuche zu verstehen, wie Klassen nach Dojo benannt werden. Ich denke, ich habe die Tutorials durchgesehen, aber wahrscheinlich habe ich etwas verpasst.Dojo-Klassennamen

Ist

define(["dojo/_base/declare"], function(declare){ 
    return declare(null, { 
    constructor: function(name){ 
     this.name = name; 
    } 
    }); 
}); 

in Person.js gleichen wie

define(["dojo/_base/declare"], function(declare){ 
    return declare("Person", null, { 
    constructor: function(name){ 
     this.name = name; 
    } 
    }); 
}); 

in SomeOtherFileName.js?

Wann müssen wir den Dateinamen im Dateinamen vs als Argument deklarieren? Würde das zweite Beispiel irgendwelche Probleme verursachen?

Antwort

2

Der Klassenname (erstes Argument von declare()) braucht nicht den Pfad zur Datei darzustellen. Eigentlich ist es optional. Der optionale Name des Konstruktors (lose, "class"), der in der Eigenschaft "declaredClass" im erstellten Prototyp gespeichert ist. Es wird als globaler Name für einen erstellten Konstruktor verwendet.

Zum Beispiel:

define(["dojo/_base/declare"], function(declare){ 
    return declare("my.firstWidget", { 
    constructor: function(){ 
     console.log(this.declaredClass) 
    } 
    }); 
}); 

Dies wird einen globalen Konstruktor, my.firstWidget, dass es wie folgt verwenden können:

require(["dojo/dom", "myApp/myWidget"], function(dom){ 
    var my = new my.firstWidget(); //note this line 
    my.placeAt(dom.byId('someID')); 
}); 

Aber dies ist eine schlechte Gebrauch davon, haben wir Dojo und wir müssen es Dojo Weg, das war nur ein Beispiel.

Aber wir tun können, es in einer deklarativen Weise verwenden, wie folgt aus:

<div data-dojo-type="my.firstWidget"></div> 

Und das ist in Ordnung.

Tatsächlich wird das erste Argument von declare() in der Neuentwicklung weggelassen. Dadurch wird sichergestellt, dass der globale Namespace nicht durch Klassen verschmutzt wird und die Wahrscheinlichkeit von Namenskonflikten reduziert wird.

Der AMD Module ID (MID) wird der allgemein als Klassenname bezeichnete Name. Dieser Name bezieht sich auf den Pfad zur Datei. Zum Beispiel myApp/myWidget.js würde die MID myApp/myWidget machen. Und das MID ist das, was wir verwenden können, wenn wir die class name weggelassen und wollen die deklarative Weise

<div data-dojo-type="myApp/myWidget"></div> 

Dies funktioniert auch verwenden, und das funktioniert auch, wenn wir die class name-declare() gab

Werfen Sie einen Blick here Es gibt viele Beispiele und Informationen über declare() im Dojo.

1

Sie sollten Ihre Klasse in der define-Anweisung platzieren und einen absoluten Pfad verwenden, um sie zu definieren. In den Funktionsdefinitionen können Sie sie dann beliebig benennen, solange Sie die Reihenfolge beibehalten. Wenn Sie diese in Ihrem Code referenzieren, müssen Sie den Wert verwenden, den Sie für den Funktionsnamen verwendet haben. Achten Sie darauf, immer das Schlüsselwort "this" zu verwenden, bevor Sie eine Funktion aufrufen. Sonst wird es nicht gefunden.

define{["dojo/_base/declare", 
     "this/is/my/path/Person", 
     "this/is/my/path/SomeOtherFileName"], 
     function(declare, 
       myPeopleClass, 
       anotherFile) { 
return declare("this.is.my.path.CurrentFile", [anotherFile], { 

     postCreate : function() { 
      var value = this.anotherFunction(); 
      //some other code 
     }, 

     anotherFunction : function() { 
      //more code 
      return something; 
     } 
}); 
});