2012-01-04 13 views
7

Jeśli śledzę szorstki wzorzec MVC w JavaScript, jaki jest najlepszy sposób wyświetlenia (na przykład elementu button), aby powiadomić kontroler?JavaScript MVC: w jaki sposób widoki powiadamiają kontrolera

Czy urządzenie button wywoła zdarzenie, którego sterownik musi słuchać? Lub, czy funkcja button wywołuje funkcję kontrolera bezpośrednio? A może kontroler powinien przypisać wydarzenie do widoku?

Dzięki za wszelkie dane wejściowe!

+0

Kontrolery nasłuchują na wejściu. Oznacza to, że kontrolery nasłuchują zdarzeń z węzłów DOM. – Raynos

+0

@Raynos: masz na myśli to, że widok przypisuje element dom i onclick, a wewnątrz tego onclick uruchamia zdarzenie, które kontroler musi zasubskrybować? dzięki! – tau

+2

Nie, widok nie ma biznesowych rozmów z kontrolerem. Kontroler pobiera w jakiś sposób uchwyt na węźle domowym i dołącza sam program obsługi. – Raynos

Odpowiedz

2

Interesujące pytanie. Sądzę, że będzie to zależało od twojej sytuacji, złożoności twojego przykładu i konkretnych wzorców JavaScriptu, z których korzystasz.

Jeśli przycisk mówisz to po prostu element HTML, to może być w prosty sposób:

var MyController = function() { 

    this.particularMethod = function() { 
     // update model 
    } 

    // Using jquery 
    var button = $("#myButton"); 
    button.click(function() { myController.particularMethod() }) 
} 

Lub, jeśli button jest przedmiot lub moduł, który został utworzony, można ustawić wywołanie zwrotne:

var Button = function(selector, clickFunction) { 
    // Using jquery 
    $(selector).click(clickFunction) 
    ... 
} 

var MyController = function() { 

    this.particularMethod = function() { 
     // update model 
    } 

    var button = new Button("#myButton", this.particularMethod); 
    ... 
} 

Niestety, trywialne przykłady tak naprawdę nie ilustrują korzyści wynikających z różnych podejść!

+0

dzięki za wejście! – tau

10

Powiedziałbym, że Zobacz powinien złapać zdarzenie zwolniony za pomocą przycisku i ogień własną imprezę, które będą obsługiwane przez kontroler.

Pozwól mi wyjaśnić:

@raynos napisał:

Kontrolery słuchać na wejściu. Oznacza to, że kontrolerzy nasłuchują zdarzeń od węzłów DOM

osobiście, mimo że zgadzam się z pierwszym stwierdzeniem, nie podoba mi się interpretacja.

Podążanie za tym stwierdzeniem oznacza, że ​​kontroler musi znać każdy przycisk/pole tekstowe/element w interfejsie użytkownika i jego identyfikator/selektor.

Preferuję zdarzenia semantyczne Zobacz ogień, takie jak "languageSelected" lub "searchRequested" i dodaj odpowiednie dane do zdarzenia.

więc typowy przepływ byłoby, że widok sprawia pewne UI (powiedzmy, że ma pola wyszukiwania i przycisk), kiedy użytkownik kliknie przycisk - The View obsługuje zdarzenie i pożary własną „searchRequested” zdarzenie. Zdarzenie to jest obsługiwane przez Kontroler, który nazwałby model Model z prośbą o wykonanie wyszukiwania. po zakończeniu, Model uruchomi evnet "searchResultsUpdated", który będzie obsługiwany przez View powodując wyświetlenie wyników.

jeśli teraz zdecydujesz się zmienić projekt swojej aplikacji, aby wyświetlać łącza do wyszukiwanych haseł zamiast pola wyszukiwania i przycisku (lub nawet jeśli masz obok siebie - lub na różnych ekranach) jedyną rzeczą, którą musisz zmiana to Wyświetl.

technicznąej side-note: Jeśli przy użyciu JQuery i zakładając swój pogląd jest javascript obiektu można korzystać

$(view).triggerHandler( 
    $.Event('eventName',{'object:'with','more':'event','related':'data'}) 
); 

do ognia zdarzenie

And

$(view).on('eventName',handler); 

aby słuchać i obsługiwać wydarzenie.

+1

IMO, to zdecydowanie lepszy sposób na zrobienie tego. Kontroler nie powinien słuchać takich rzeczy jak przycisk kliknięty, powinien słuchać zdarzeń semantycznych/żądanej funkcjonalności. JAK ta funkcja jest inicjowana przez użytkownika końcowego może się różnić między dwoma różnymi widokami (ludzie często zapominają, że jednym z głównych punktów MVC jest możliwość posiadania wielu widoków bez potrzeby zmiany modelu lub kontrolera). –

1

Istnieje wiele sposobów, aby to zrobić. Oto jeden sposób.

var app = new App(); 

function App() { 
    var model = new Model(); 
    var view = new View(); 
    var controller = new Controller(view, model); 
} 

function Controller(view, model) { 
    view.addActionListener(function() { 
    alert("on activate"); 
    }); 
} 

function View() { 
    var self = this; 
    $("button").onclick = function() { 
    self.listener(); 
    } 
} 

View.prototype.addActionListener = function(listener) { 
    this.listener = listener; 
} 
Powiązane problemy