2015-01-06 22 views
6

Mam scenariusz w komponencie emberjs, w którym obserwacja nie zostaje trafiona. Wyjaśniałem przyczynę jako "komponent nie został jeszcze wstawiony, gdy ustawiona jest właściwość składnika obserwowana."Obserwator komponentu ember js nie działa

Moje pytanie brzmi, czy można to lepiej załatwić w ember js?

Lepsze wyjaśnienie można znaleźć w poniższych jsbin`s.

Not working Scenario

Working scenario

+0

Co dokładnie próbujesz osiągnąć tutaj? W tym scenariuszu obie funkcje obserwatora będą lepiej służyć jako obliczona właściwość (za pośrednictwem 'Ember.Compute'). – awgreenarrow08

+0

Uzgodnione, obserwatorzy są przesadą w obu sytuacjach. – Kingpin2k

+0

Tak jak wspomniałem w komentarzach, był to przykład, a nie rzeczywisty przypadek użycia. Rzeczywisty przypadek użycia jest ogromny i pomyślałem o uproszczeniu go. Zasadniczo istnieje wiele obliczeń w obserwatorze i nie tylko przypisanie ich do innej właściwości Również, gdy powiemy "obie funkcje obserwatora będą lepiej służyć jako obliczona właściwość" , jeśli użyje się obliczonej właściwości w komponencie nie będzie działać z tego samego powodu, dla którego obserwator nie pracuje – wallop

Odpowiedz

14

Można określić .on('init') zmusić obserwatorów do uruchomienia zaraz po inicjalizacji; inaczej jak @ Kingpin2k wspomniano - nie uruchamiać

App.TextboxDisplayComponent = Ember.Component.extend({ 
    displayText: '',   

    boundProperty: '', 

    observeBoundProperty: function() { 
    this.set('displayText', this.get('boundProperty'));   
    }.observes('boundProperty').on('init') 
}); 

Państwa (nie) działający przykład here

+1

dokładnie to, co chciałem, dziękuję Kiedy próbowałem tego, myślałem, że obserwator otrzyma trafienie tylko "na" ("init") "i nie zostanie trafiony, gdy pojawią się zwykłe zmiany. Teraz testowałem to i zdarza się, nawet gdy jest zmiana – wallop

+0

Jednak właśnie zrozumiałem, dlaczego wcześniej użyłem tej koncepcji, jest w tym haczyk! observeBoundProperty zostałby pobrany exactued na init, nawet jeśli boundProperty nie zostanie zmieniony. Jeśli chciałbym, aby obserwator dostał uderzenie tylko przy zmianie, to nie będzie to zbyt pomocne:) Ale mimo to mógłbym sprawdzić stan w środku, a co najważniejsze jest to o wiele bardziej czysta wersja! – wallop