2013-04-29 8 views
6

Dokumentacja v1.0.0-rc.3 Ember z dnia Ember.Array mówi:Korzystanie Ember w „zauważa, (..)” obserwować modyfikacja jakiegoś Array

Można użyć metody zdefiniowane w tym module, aby uzyskać dostęp i modyfikować tablicę treść w sposób przyjazny dla KVO. Możesz również otrzymać powiadomienie, gdy członkostwo w przypadku [sic] tablicy zmieni się, zmieniając składnię właściwości na .observes ('* myProperty. []').

Próbowałem wymyślić minimalny przykład obserwując zmiany w tablicy, ale nie mogłem wywołać ognia obserwatora. Jak wygląda działająca próbka?

P.S. zawiadomienie this gotcha.

+1

możesz ustawić jsfiddle swojego niedziałającego przykładu? – intuitivepixel

Odpowiedz

9

Oh hej, jest moja odpowiedź!

Istnieje kilka sposobów na obserwowanie właściwości Em.A(). Masz .observes('a.[]'), .observes('[email protected]') i .observes('a.length'). Koncepcja jest taka sama jak każda własność w Ember, musisz tylko bezpośrednio manipulować tablicą, a obserwator powinien strzelać. Oczywiście użycie metody set nie będzie działało na tablicy (Ember), więc może właśnie tam popełniłeś błąd?

Zmodyfikowałem mój stary jsfiddle w celu objęcia tablicy obserwowalnej (zaktualizowałem wszystko do najnowszych wersji).

Myślę, że ważne jest, aby pamiętać, że Ember Array w rzeczywistości nie jest tablicą - jest to obiekt z pewnymi niestandardowymi funkcjami i właściwościami, które implementują zwykłe funkcje javascript tablicy. Więc nie można zrobić coś takiego: Em.A() = [1,2,3], ponieważ typ Em.A jest obiektem, a nie tablicą.

Innym przydatnym uwaga jest taka, że ​​ArrayControllers mieć zawartość tablicy Ember, co oznacza, że ​​trzeba obserwować tablicę zawartości, nie sama treść (tzn nie obserwować arraycontroller.content, ale zamiast obserwować arraycontroller.content.[]).

Oto dlaczego musisz obserwować dziwnie wyglądającą właściwość prop.[] na tablicy Ember, ponieważ wartość tablicy Ember nie jest zgodna z oczekiwaniami.

+0

Dziękuję Deif za tę wspaniałą opinię i spostrzeżenia ... tak, nie otrzymałem próbki działającej dla jakiegoś podobnego problemu: użyłem (... przyklejając się do twojego przykładu jsFiddle) 'this.person.push (3)' zamiast 'this.person.pushObject (3)'. Trzeba użyć metody 'pushObject (..)', aby mieć widok obserwatorów (...). [Sądzę, że to właśnie oznacza dokumentacja Embera z "zgodną z KVO"] (http://emberjs.com/api/classes/Ember.MutableArray.html#method_pushObject). – Abdull

+0

Awesome ... !!! @Deif –