Widoki a komponenty w Ember.js

143

Uczę się ember.js i próbuję zrozumieć różnicę między widokiem a komponentem. Postrzegam oba sposoby tworzenia elementów wielokrotnego użytku.

Ze strony internetowej Ember na temat wyświetleń:

Widoki w Ember.js są zwykle tworzone tylko z następujących powodów: -
Gdy potrzebujesz zaawansowanej obsługi zdarzeń użytkownika -
Gdy chcesz utworzyć komponent wielokrotnego użytku

Ze strony internetowej Ember na temat komponentów:

Komponent to niestandardowy tag HTML, którego zachowanie implementujesz za pomocą JavaScript i którego wygląd opisujesz za pomocą szablonów Handlebars. Umożliwiają tworzenie kontrolek wielokrotnego użytku, które mogą uprościć szablony aplikacji.

Jaka jest więc główna różnica między widokiem a komponentem? A jaki byłby typowy przykład, w którym wolałbym użyć widoku komponentu i odwrotnie?

Bradley Trager
źródło

Odpowiedzi:

170

Ember.View

Ember.View jest obecnie ograniczony znacznikami, które są tworzone przez W3C do. Ale gdybyś chciał zdefiniować własne tagi HTML specyficzne dla aplikacji, a następnie zaimplementować ich zachowanie za pomocą JavaScript? W rzeczywistości nie możesz tego zrobić za pomocą Ember.View .

Element żarowy

Dokładnie to umożliwiają komponenty. Właściwie to taki dobry pomysł, że W3C pracuje obecnie nad specyfikacją elementów niestandardowych .

Implementacja komponentów w Ember stara się być jak najbliżej specyfikacji Web Components. Gdy elementy niestandardowe staną się powszechnie dostępne w przeglądarkach, powinieneś mieć możliwość łatwej migracji komponentów Ember do standardu W3C i umożliwienia ich używania również przez inne frameworki, które przyjęły nowy standard.

Jest to dla nas tak ważne, że ściśle współpracujemy z organami normalizacyjnymi, aby upewnić się, że wdrażanie komponentów jest zgodne z mapą drogową platformy internetowej.

Należy również zauważyć, że Ember.Component jest w rzeczywistości Ember.View (podklasą), ale jest całkowicie odizolowany . Dostęp do właściwości w jego szablonach prowadzi do obiektu widoku, a działania są również kierowane na obiekt widoku . Nie ma dostępu do otaczających contextlub zewnętrznych controller informacji kontekstowych , które są przekazywane , co nie ma miejsca w przypadku Ember.View, który rzeczywiście ma dostęp do otaczającego go kontrolera, na przykład wewnątrz widoku można zrobić coś takiego, this.get('controller')co dałoby kontroler aktualnie powiązany z widokiem.

Jaka jest więc główna różnica między widokiem a komponentem?

Tak więc główna różnica, poza tym, że komponenty pozwalają tworzyć własne tagi, aw pewnym momencie w przyszłości, gdy będą dostępne elementy niestandardowe, będą również migrować / używać tych komponentów w innych strukturach, które będą obsługiwać elementy niestandardowe, w rzeczywistości jest to, że w pewnym momencie komponent ember sprawi, że widok będzie nieco przestarzały, w zależności od konkretnego przypadku wdrożenia.

A jaki byłby typowy przykład, w którym wolałbym użyć widoku komponentu i odwrotnie?

Postępując zgodnie z powyższym, zależy to wyraźnie od przypadków użycia. Ale z reguły, jeśli potrzebujesz w swoim widoku dostępu do otaczającego go kontrolera itp., Użyj Ember.View , ale jeśli chcesz odizolować widok i przekazać tylko informacje, które muszą działać, czyniąc go niezależnym od kontekstu i wiele więcej wielokrotnego użytku, użyj komponentu Ember.Component .

Mam nadzieję, że to pomoże.

Aktualizacja

Wraz z publikacją Road to Ember 2.0 w większości przypadków zachęcamy do używania komponentów zamiast widoków.

intuicyjny piksel
źródło
1
Moją jedyną troską o komponenty jest to, kiedy stają się złożone. Nie wiem jeszcze, jak oddzielić część logiczną od części renderującej. W zwykłych widokach masz tę separację i możesz umieścić logikę w kontrolerze, ale z komponentem zwykle mówię, że skończysz z bardzo złożonym i być może ogromnym bałaganem. Czy wiesz, czy możliwe jest zdefiniowanie dedykowanego kontrolera podobnego do komponentów? A może komponenty nie są po prostu przeznaczone do zarządzania złożonymi elementami graficznymi.
sly7_7,
3
@ sly7_7, tak, rozumiem. Ale pomyślałbym o komponencie jak o czarnej skrzynce, zachowującym się tylko w oparciu o dane, które są przez niego przekazywane. I tak, w zależności od tego, co robi, może to bardzo szybko stać się bałaganem. Dedykowany kontroler miałby absolutny sens, a sposób, w jaki mógłby działać, wyglądałby, gdyby komponenty mogły zostać wstrzyknięte do niego logika, ale z tego co wiem, komponenty nie są częścią pojemnika żaru z założenia, ale może się to zmienić w przyszłości na rozwiąż dokładnie coś takiego. Dobra uwaga!
intuitivepixel,
2
może jakieś powiązania udać się z komponentu? IE, w przypadku formy blokowej komponentu, czy elementy zawartości w bloku mogą wiązać się z właściwościami komponentu, czy też muszę w tym przypadku użyć widoku?
Michael Johnston,
2
ach, tak, mogą. {{view.xxxx}}działa w komponencie tak samo jak w widoku.
Michael Johnston,
Komentarze Toma Dale'a na ten temat: ember.zone/the-confusion-around-ember-views-and-components/…
Akshay Rawat
17

Odpowiedź jest prosta: użyj komponentów

Zgodnie z filmem szkoleniowym nagranym w sierpniu 2013 r., Yehuda Kats i Tom Dale (członkowie zespołu Ember Core Team) powiedzieli publiczności, aby nie korzystali z widoków, chyba że jesteś programistą frameworka. Wprowadzili wiele ulepszeń kierownic i wprowadzili komponenty, więc widoki nie są już potrzebne. Widoki są używane wewnętrznie do zasilania takich elementów, jak {{#if}} i {{outlet}}.

Komponenty również ściśle naśladują standard Web Component, który zostanie wbudowany w przeglądarkę, więc wygoda tworzenia komponentów Ember ma wiele dodatkowych zalet.

Aktualizacja 2014-11-27

Jeszcze ważniejsze jest teraz używanie komponentów zamiast widoków, ponieważ Ember 2.0 będzie używał komponentów routowalnych, gdy zostanie wprowadzona trasa, zamiast kontrolera / widoku. Aby zabezpieczyć swoją aplikację w przyszłości, najlepiej trzymać się z daleka od Widoków.

Źródła:

Johnny Oshika
źródło
5
„Jeśli uważasz, że musisz użyć widoku, użyj zamiast tego komponentu”. to okropna rada, która zdradza brak zrozumienia izolacji, jaką zawierają elementy.
jmcd,
@jmcd, chociaż ten komentarz pochodzi od samych programistów frameworka, usunąłem go.
Johnny Oshika
2
Znalazłem źródło: szkolenie wideo Gaslight, wideo 10.3 Pytania i odpowiedzi dotyczące komponentów @ znak 26m. Tom mówi: „Odkąd te przykłady zostały napisane,… dodaliśmy Komponenty [które] nie istniały, kiedy te przykłady były pisane. Ogólnie rzecz biorąc, powiedziałbym, że widoki nie są czymś, czego oczekiwalibyśmy od większości programistów, są one bardziej wewnętrznym obiektem księgowym w tym momencie '
jmcd
2
@jmcd, W tym filmie @ 26:15 Tom mówi „w zasadzie nie używaj widoków”. Ponadto, jeśli przeskoczysz do 30 m w tym samym filmie, Yehuda Katz mówi: „Widok jest zasadniczo wewnętrznym szczegółem implementacji… możesz użyć widoku, ale jesteś programistą frameworku. Zamiast tego powinieneś użyć jednej z rzeczy który stworzyliśmy dla Ciebie, który używa widoku, a ten, który jest najbliższy widokowi, ale ma lepszą semantykę, to komponent. Wszystko, do czego można było używać widoku wcześniej, komponent jest w porządku ”.
Johnny Oshika,
5

Na obecnym v2.xetapie - jako obecna stabilna wersja - widoki zostały całkowicie wycofane. Mówi się, że widoki są usuwane z interfejsu API Ember 2.0 .

Tak więc użycie {{view}}słowa kluczowego w Ember 2.0 wywoła asercję:

Asercja nie powiodła się: użycie {{view}}lub dowolna ścieżka oparta na nim została usunięta w Ember 2.0

Jeśli musisz używać widoków w Ember 2.0, możesz użyć dodatku ember-legacy-views , który będzie kompatybilny z Ember do wersji 2.4 .

Podsumowując - komponenty to teraźniejszość (usuwane widoki) i przyszłość - zastąpią też kontrolery. Zobacz dokument RFC dotyczący składników routowalnych .

Daniel Kmak
źródło