2017-06-06 4 views
1

I statische Klasse Konstanten meiner Ansicht nach VorlageSo verwenden statische Methoden im Hinblick auf Vorlagen

Javascript

class FilterModel { 
    static const FILTER_TYPE_STRING() { 
    return 'string'; 
    } 
} 

HTML

<div show.bind="selectedFacet.type===FilterModel.FILTER_TYPE_STRING"> 
</div> 
+0

Im mit ES2016/ESNext. Können Sie bitte ein vollständiges Beispiel angeben? –

+0

Entschuldigung, Ihre Frage ergibt keinen Sinn für mich. Das Ansichtsmodell ist eine Instanz. Warum möchten Sie eine statische Methode aus Ihrer eigenen Klasse verwenden? –

Antwort

2

Kurze Antwort verwenden möchten: die Bindungs ​​Sprache unterstützt das nicht.

Ich habe das Problem zuvor, aber fand keine gute Problemumgehung. In diesem Fall definiere ich normalerweise eine Konstante, aus der die Klasse den Wert im Konstruktor setzen würde, und füge einen Kommentar hinzu, um zu zeigen, dass sie statisch sein sollte.

const _filterTypeString: string = 'string'; 

export class FilterModel { 
    /*static*/ filterTypeString: string = _filterTypeString; 
} 

Längere Antwort: static Mitglieder in JavaScript werden direkt in die Klasse, nicht in den Prototyp transpiled, so Instanzen nicht Bezug auf sie haben. Der Unterschied ist:

class MyClass { 
    instanceMember: number = 256 
    static staticMember: number = 1024; 
} 

//referencing them: 
MyClass.prototype.instanceMember 
MyClass.staticMember 

Jedesmal, wenn Sie eine Objektinstanz zu erstellen, eine Kopie des Prototyps erzeugt, so dass this gleiche Werte zu dem Prototyp haben würde. Aurelia erstellt auch eine Instanz, wenn ein View-Modell erstellt wird.

In der Ansichtsvorlage können Sie nur auf Elemente dieses Objekts zugreifen, die vom Prototyp geerbt wurden. Da die statische Methode kein Mitglied dieses Objekts ist, können Sie nicht darauf zugreifen. Natürlich könnten Sie eine Referenz erstellen, aber ich fand diese Problemumgehung ärgerlicher als die obige. Mit Codebeispiel:

export class FilterModel { 
    static filterTypeString: string = 'string'; 
    refToFilterTypeString = FilterModel.filterTypeString; 
} 

HTML:

<div show.bind="selectedFacet.type === refToFilterTypeString"> 
</div>