Oto bardziej bezpośrednia odpowiedź na twoje pytanie.
W drugim przykładzie chodzi o funkcję, która musi znajdować się w zakresie globalnym (tj. Właściwość obiektu window
).
W pierwszym przykładzie odwołujesz się do właściwości bieżącego modelu widoku.
Tak, to subtelne rozróżnienie, ale jest ważne. Jeśli używasz atrybutów na zdarzeniu, możesz odwoływać się tylko do rzeczy istniejących w zasięgu globalnym. Oznacza to, że musisz umieścić wszystko, co chcesz, w zasięgu globalnym, co prowadzi do bardzo niechlujnego kodu.
Jeśli używasz powiązań deklaratywnych, dokładne znaczenie powiązań zależy od kontekstu.
Pomaga myśleć o znacznikach HTML jako bardziej przypadkowych. To, na co naprawdę patrzysz, to uporządkowany dostęp do modelu widoku. Pomyśl o with
i forEach
jako kontekstach zagnieżdżonych i innych powiązaniach jako ich atrybutach. Relacja między deklaracjami wiążącymi a leżącym u podstaw HTML nagle wydaje się bardziej podobna do pracy z XSLT.
Dwa przykłady: wyglądają bardzo podobnie w przypadku. Jednak podstawowe koncepcje są bardzo różne i powodują, że dane wiążące się z tak mocnymi atrybutami są tak nieprzyjemne.
Powód, dla którego atrybuty zdarzeń na żywo są mile widziane, nie polega tylko na tym, że łączą one logikę ze strukturą. Chodzi o to, że są one słabą próbą zrzucenia dowolnego kodu JavaScript do elementów HTML, co uniemożliwia właściwe enkapsulowanie logiki aplikacji.Atrybuty na zdarzeniu to "haki" niskiego poziomu, a powiązania wydłużają zachowanie elementów.
Wszystko, co powiedzieliśmy, jest możliwe, aby zrobić te same straszne rzeczy, które ludzie zrobili z atrybutami na zdarzeniu, używając deklaratywnych wiązań. Różnica polega na tym, co jeszcze możesz z nimi zrobić. Nie zawsze należy oceniać technologie pod kątem ich nadużywania - wszyscy jesteśmy tutaj dorośli.
Zawsze byłem przekonany, że powinieneś spróbować nie mieć więcej niż jednego języka w jednym pliku. Zazwyczaj ustawiam id lub klasę i wiążę z nią funkcję po zakończeniu budowy strony. – dqhendricks
Wydaje się, że problem tutaj jest mniej o MVVM i więcej o zaletach/wadach dyskretnego JavaScript: http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – Craig
@Craig Mając to powiązanie danych w znacznikach nie wydaje się w duch dyskretnego js, więc nie jestem pewien, o co w tym naprawdę chodzi. – heisenberg