2016-10-17 2 views
1

Im Layout, an dem ich gerade arbeite (basierend auf dieser fiddle), hängt eine verschachtelte Komponente (die sticky scrollbar) von den Dimensionen der übergeordneten Komponente ab, also überlasse ich diese Dimensionen als Attribute. Etwas wie:Übergeben der Komponentenabmessungen an eine andere verschachtelte Komponente in Ember

{{!-- Rest of the template --}} 

{{div-scroller 
    width=tracksWidth offset=tracksOffset 
    scrollWidth=tracksScrollWidth scrollLeft=tracksScrollLeft 
    scrollUpdated=(action "updateComponentScroll") }} 

Das Problem ist, dass in Embers Komponente Lebenszyklus, nur die Dimensionen für eine Komponente nach didInsertElement erhalten. Wenn ich versuche, dies zu tun:

didInsertElement(...args) { 
    this._super(args); 

    // Get dimensions 
    this.set("tracksWidth", this.$().width()); 
    this.set("tracksOffset", this.$().offset()); 
    this.set("tracksScrollWidth", this.$().get(0).scrollWidth); 
    this.set("tracksScrollLeft", this.$().scrollLeft()); 
    this.set("lastScrollPosition", this.$().scrollLeft()); 
} 

Ember beklagt, dass ich nicht Objekte im didInsertElement (oder in didRender) aus Leistungsgründen setzen soll.

Gibt es eine andere Möglichkeit, die Dimensionen einer übergeordneten Komponente an eine untergeordnete Komponente zu übergeben?

+0

Vielleicht ist es nicht mit Ihrem Anwendungsfall möglich, aber haben Sie versucht Addon dies für Sie zu tun? Ich habe einen perfekten Scrollbar-Wrapper [ember-cli-scrollbar] (https://github.com/Keeo/ember-cli-scrollbar) erstellt, um mir dabei zu helfen. – Keo

+0

Danke, Keo. Ich habe deinen Wrapper sogar ausprobiert, genauso wie die perfekte Scrollleiste, aber es hat nicht funktioniert. Mein Layout ist ein bisschen komplex und das div Ich brauche die Bildlaufleiste für hat zwei blättern Eltern: die vertikale scrollt div mit seinem Geschwister und es ist an die Eltern, während die horizontale scrollt nur das div (und nicht das Geschwister) und es ist an das div selbst. – JayC

+5

Ich sehe, nun denke ich, dass ich es versuchen würde (aber wahrscheinlich einige Probleme haben wird), Setzer in 'Ember.run.later' oder' Ember.run.scheduleOnce ('afterRender', ...) '[templateOnce ] (http://emberjs.com/api/classes/Ember.run.html#method_scheduleOnce). – Keo

Antwort

2

Sie können dies tun, indem Sie die Setter in Ember.run.later oder Ember.run.scheduleOnce('afterRender',...) verpacken. Übrigens können Sie auch setProperties verwenden.

didInsertElement() { 
    this._super(...arguments); 

    Ember.run.scheduleOnce('afterRender',() => { 
    const self = this.$(); 

    this.setProperties({ 
     tracksWidth: self.width(), 
     tracksOffset: self.offset(), 
     tracksScrollWidth: self.get(0).scrollWidth(), 
     tracksScrollLeft: self.scrollLeft(), 
     lastScrollPosition: self.scrollLeft(), 
    }); 
    }); 
} 
0

Meiner Meinung nach sollten Sie die Dimension der Eltern nicht an die untergeordnete Komponente übergeben. Es könnte einen Weg geben, das mit CSS zu tun. Auch wenn es mit reinem CSS nicht möglich ist, muss es eine Javascript-Möglichkeit geben, dass jede Komponente nur ihre eigenen Dimensionen kennen sollte. Am Ende müssen Sie keine Daten weitergeben, die Sie unter didRender erhalten. Das ist meine Meinung.

Natürlich müssen Sie manchmal Daten verwenden, die Sie unter didRender hook bekommen. Für diese Anforderungen können Sie Ember Run Loop verwenden. (Wie von Keo bei Kommentaren erwähnt.)

+1

'Meiner Meinung nach sollten Sie die Dimension des Elternteils nicht an die Kindkomponente übergeben." Ich stimme zu, das sieht eher nach Deadline-Hack als nach richtiger Lösung aus. – Keo

+0

Es ist kein Deadline-Hack, es ist ein wiederkehrendes Problem, das ich im letzten Jahr mit dem Layout hatte (ungefähr dieses: https://jsfiddle.net/jcano/mjevq22a/1/). Die breiten divs sind von unterschiedlicher Breite, aber sie sollten miteinander und den Kategorien auf der linken Seite ausgerichtet sein. Die horizontale Bildlaufleiste der rechten Seite sollte immer am unteren Rand des Fensters sein. Die beste Lösung wäre, das rechte Panel zu fixieren, aber sie werden nicht umfassend unterstützt und selbst mit Sticky ist die Implementierung schwierig. Reines CSS ist sonst nicht möglich. Ich könnte damit eine neue Frage beginnen, wenn Sie interessiert sind. – JayC

+0

Ja, Sie haben Recht. Manchmal könnte reines CSS nicht möglich sein. Für diese Fälle versuchen wir einen Weg zu finden, dass jede Komponente nur ihre eigenen Dimensionen kennt. So können unsere Komponenten perfekt in jeder Komponente funktionieren. – ykaragol

Verwandte Themen