2016-05-05 7 views
1

Ich habe ein benutzerdefiniertes Attribut, das der bindingContext eine Eigenschaft hinzufügt, damit andere benutzerdefinierte Attribute/Elemente diese Daten verwenden können.Aurelia-Wiederholung scheint benutzerdefinierte Eigenschaften im übergeordneten Bereich zu löschen

das Attribut bind Methode kann also zum Beispiel wie folgt aussehen:

bind(binding, scope) { 
    binding.someCustomProperty= this.value; // have tried using scope too 
} 

nun im Rahmen dieses benutzerdefinierten Attributs enthalten alles funktioniert einwandfrei, das heißt:

<section my-attribute="something"> 
    <input some-other-attribute="somethingElse"> 
</section> 

So ist der Abschnitt setzt Attribut unter der Annahme, Die bindingContext Eigenschaft, dann würde die some-other-attribute Zugriff auf diese Eigenschaft auf der bindingContext und es würde alles funktionieren.

Allerdings kommt das Problem, wenn ich eine Wiederholung verwenden und die some-other-attribute innerhalb der Bindung wiederholen möchten, verliert die bindingContext die someCustomProperty. Gibt es also eine "richtige" Möglichkeit, einen Bindungskontext hinzuzufügen und durch wiederholte oder andere untergeordnete Bindungen zu bestehen?

Antwort

4

Vielleicht möchten Sie Ihre benutzerdefinierte Attribut ändern, wie dies funktioniert:

bind(bindingContext, overrideContext) { 
    overrideContext.someProperty = something; 
} 

Ich schlage Ihnen die Verwendung overrideContext, weil einer der Hauptgründe, besteht es zum Speichern zusätzlicher „kontextuellen“ bindable Requisiten ist wie $event, $first, $last, $index usw., ohne dem zugrundeliegenden View-Modell Requisiten hinzuzufügen.

Diese Änderung allein löst das Problem nicht. Was passiert, ist, dass jedes Element in der Wiederholung seinen eigenen BindingContext/overrideContext hat. Diese sind eine Hierarchie, so könnte man den „repeat“ Szenario erkennen, indem der Suche nach repeat-specific props wie $first, $last, $odd, $even:

bind(bindingContext, overrideContext) { 
    // are we in a repeat? 
    if ($even in overrideContext) { 
    overrideContext = overrideContext.parentOverrideContext; 
    } 
    overrideContext.someProperty = something; 
} 
+0

Ah brillant, geben, dass ein zu gehen, so standardmäßig tun alle Kontexte haben Zugriff zu ihren Eltern (wie gezeigt)? – Grofit

+0

rechts, wenn Sie etwas tun wie 'foo.bind =" bar "', wird das Bindungssystem nach 'bar' auf dem overrideContext suchen, dann auf dem bindingContext, dann auf dem übergeordneten overrideContext, dann auf dem übergeordneten bindingContext, und so weiter. –

+0

Nicht alle Kontexte haben Zugriff auf ihre übergeordneten Elemente. Ein benutzerdefiniertes Element hat beispielsweise keinen parentOverrideContext. Dadurch bleiben benutzerdefinierte Elemente gekapselt und portabel. Sie können nicht auf den äußeren Bereich zugreifen. –

Verwandte Themen