«Привет, мир» в MVC Pattern - PullRequest
       49

«Привет, мир» в MVC Pattern

29 голосов
/ 14 декабря 2011

В интервью для какой-то компании мне задали этот вопрос.

Какие шаблоны проектирования вы знаете ... тогда мне сказали написать простейшее приложение "hello world" на основе MVC Design Pattern.

Я создал программу на JavaScript

var arr = ["a","b","c","d"];   // this is an array, same as store or model
alert(arr[0]);                // this is controller
//and browser alert is a view.

, позже мне сказали, что оповещение - это представление.Основная концепция MVC, которую я знаю, заключается в том, что о любых изменениях в Model сообщается View.И между ними есть контроллер для вызова методов.

Можете ли вы исправить мой подход или предложить альтернативное решение для приложения hello world MVC.Также объясните тонкие аспекты MVC.

Спасибо.

Ответы [ 5 ]

101 голосов
/ 14 декабря 2011
var M = {}, V = {}, C = {};

M.data = "hello world";

V.render = function (M) { alert(M.data); }

C.handleOnload = function () { V.render(M); }

window.onload = C.handleOnLoad;

Контроллер (C) прослушивает какой-то поток взаимодействия / событий.В данном случае это событие загрузки страницы.

Модель (M) - это абстракция источника данных.

Представление (V) знает, как отображать данные из Модели.

Контроллер приказывает View сделать что-то с Моделью.

В этом примере

  • представление ничего не знает о модели, кроме того, что оно реализует некоторый интерфейс
  • модель ничего не знает о представлении и контроллере
  • Контроллер знает как о модели, так и о представлении, и велит представлению пойти и сделать что-то с данными из модели.

Обратите внимание, что приведенный выше пример является серьезным упрощением для демонстрации целей.Для реальных примеров "hello world" в мире JS MVC посмотрите на todoMVC

19 голосов
/ 09 марта 2014

Лучший пример

var M = {}, V = {}, C = {};

/* Model View Controller Pattern with Form Example */


/* Controller Handles the Events */

M = {
    data: {
        userName : "Dummy Guy",
        userNumber : "000000000"
    }, 
    setData : function(d){
        this.data.userName = d.userName;
        this.data.userNumber = d.userNumber;
    },
    getData : function(){
        return data;
    }
}

V = {
    userName : document.querySelector("#inputUserName"),
    userNumber : document.querySelector("#inputUserNumber"),
    update: function(M){
        this.userName.value = M.data.userName;
        this.userNumber.value = M.data.userNumber;
    }
}

C = {
    model: M,
    view: V,
    handler: function(){
        this.view.update(this.model);
    }
}

document.querySelector(".submitBtn").addEventListener("click", function(){
    C.handler.call(C);
}); 

/* Model Handles the Data */

/* View Handles the Display */
5 голосов
/ 18 марта 2017

Архитектура MVC

Я написал статью об архитектуре MVC. Вот только некоторый код, надеюсь, кто-нибудь найдет его полезным.


//Modal
var modal = { data: "This is data"};

//View
var view =  { display : function () { 
    console.log ("////////////////////////////");
    console.log ( modal.data);
    console.log ("////////////////////////////");
    }
};

//Controller
var controller = ( function () {
    view.display();
    })();

Из приведенного выше примера просто поймите, что в этом проекте есть три разных блока, каждый из которых выполняет определенную работу. Давайте создадим MVC-дизайн из приведенной выше инфраструктуры. Может быть несколько представлений и Observer, здесь сначала создается только другое представление.


// Modal
var modal = { data: "This is data"};
// View
var slashView =  { display : function () { 
    console.log ("////////////////////////////");
    console.log ( modal.data);
    console.log ("////////////////////////////");
    }
};
var starView =  { display : function () { 
    console.log ("****************************");
    console.log ( modal.data);
    console.log ("****************************");
    }
};

// Controller
var controller = ( function () {
    slashView.display();
    starView.display();
})(); 

Здесь понимается, что модальный режим не должен зависеть ни от представления, ни от зрителей, ни от операций, выполняемых с данными. Модал данных может быть автономным, но требуется представление и контроллер, потому что один должен показывать данные, а другой должен манипулировать ими. Таким образом, представление и контроллер создаются из-за модальности, а не наоборот.


//Modal
var modal = { 
data : ["JS in object based language"," JS implements prototypal   inheritance"]
};

// View is created with modal
function View(m) {
    this.modal = m;
    this.display = function () {
        console.log("***********************************");
        console.log(this.modal.data[0]);
        console.log("***********************************");
    };
}

function Controller(v){
    this.view = v;
    this.informView = function(){
        // update the modal
        this.view.display();
    };
}
// Test
var consoleView = new View(modal);
var controller = new Controller(consoleView);
controller.informView();

Из вышесказанного видно, что между представлением и контроллером установлена ​​связь. И это одно из требований шаблона MVC. Чтобы продемонстрировать изменение модального режима, давайте изменим программу и заметим, что изменение состояния модального режима выполняется независимо и отражает это.

//Modal
function Modal(){
this.state = 0;
this.data = ["JS is object based language","JS implements prototypal inheritance"];
//
this.getState = function (){
    return this.state;
};
this.changeState = function (value) {
    this.state = value;
};
}

// View is created with modal
function View(m) {
    this.modal = m;
    this.display = function () {
        console.log("***********************************");
        console.log(this.modal.data[modal.getState()]);
        console.log("***********************************");
    };
}
//controller is created with the view
function Controller(v){
    this.view = v;
    this.updateView = function(){
        // update the view
        this.view.display();
    };
}
// Test
var modal = new Modal();
var consoleView = new View(modal);
var controller = new Controller(consoleView);
controller.updateView();
// change the state of the modal
modal.changeState(1);
controller.updateView();

При изменении состояния модального режима контроллер отправляет сообщение в представление для обновления. Это нормально, но все же остается одна основная концепция, которая должна быть реализована, и именно модал должен идентифицировать наблюдателя или диспетчера. Чтобы это произошло, должна быть связь между модалом и контроллером, чтобы любое количество контролеров могло проявить интерес к модалу, это считается регистрацией наблюдателя на модале. Это отношение корабля реализовано с использованием концепции, что наблюдатель не существует в воздухе. Его существование происходит из-за интереса к модалу, поэтому, когда он создается, он должен быть создан с использованием модала, который ему необходим для проявления интереса, или, другими словами, у него есть доступ к модалу. Давайте рассмотрим пример ниже и посмотрим, как этот шаблон проектирования MVC достигается просто и элегантно с помощью JavaScript.

function Modal(){
    var stateChanged =  false;
    var state = 0;
    var listeners = [];
    var data = ["JS is object based language","JS implements prototypal inheritance"];
    // To access the data
    this.getData = function(){
        return data;
    };
    // To get the current state
    this.getState = function (){
        return state;
    };
    // For simplicity sake we have added this helper function here to show 
    // what happens when the state of the data is changed
    this.changeState = function (value) {
            state = value;
        stateChanged = true;
        notifyAllObservers();
    };
    // All interested parties get notified of change
    function notifyAllObservers (){
    var i;
        for(i = 0; i < listeners.length; i++){
            listeners[i].notify();
        }
    };
    // All interested parties are stored in an array of list
    this.addObserver = function (listener){
        listeners.push(listener);
    };
}

// View class, View is created with modal

function View(m) {
    this.modal = m;
    this.display = function () {
        console.log("***********************************");
        var data = this.modal.getData();
        console.log(data[modal.getState()]);
        console.log("***********************************");
    };
}


// Controller or Observer class has access to both modal and a view
function Controller(m,v){
    this.view = v;
    this.modal = m;
    this.modal.addObserver(this);

    // update view
    this.updateView = function(){
        this.view.display();
    };
    // Receives notification from the modal
    this.notify = function(){
        // state has changed
        this.updateView();
    };
}

// Test
var modal = new Modal();
var consoleView = new View(modal);
var controller = new Controller(modal,consoleView);
// change the state of the modal
modal.changeState(1);
modal.changeState(0);
modal.changeState(1);
modal.changeState(0);

Из вышесказанного видно, что наблюдатель зарегистрировал себя с помощью модальной функции addObsever и установил ссылку на модал. После того, как все экземпляры созданы. Модальное состояние было изменено вручную, чтобы показать эффект на виде. Обычно в среде с графическим интерфейсом изменения обычно выполняются либо нажатием любой кнопки пользователем, либо с любого другого внешнего ввода. Мы можем смоделировать внешний вход от генератора случайных чисел и наблюдать эффект. Здесь, в приведенном ниже примере, в данные добавлено еще несколько элементов, чтобы ясно показать эффект.

function Modal(){
var stateChanged =  false;
var state = 0;
var listeners = [];
var data = [
"JS is object based language","JS implements prototypal inheritance",
"JS  has many functional language features", "JS is loosely typed language",
"JS still dominates the Web", "JS is getting matured ","JS shares code               
through prototypal inheritance","JS has many useful libraries like JQuery",
"JS is now known as ECMAScript","JS is said to rule the future of Web for      
many years"];

//
this.getData = function(){
    return data;
};
//
this.getState = function (){
    return state;
};

this.changeState = function (value) {
    state = value;
    stateChanged = true;
    notifyAllObservers();
};

function notifyAllObservers (){
var i;
    for(i = 0; i < listeners.length; i++){
        listeners[i].notify();
    }
}
this.addObserver = function (listner){
    listeners.push(listner);
};
}

// View is created with modal

function View(m) {
    this.modal = m;
    this.display = function () {
    console.log("****************************************************");
        var data = this.modal.getData();
        console.log(data[modal.getState()]);
    };
    //Adding external simulation of user sending input 

    this.pressButton = function(){
        var seed = 10;
        var number = Math.round(Math.random() * seed) ;
        // change the state of modal
        this.modal.changeState(number);
    };
}
// Controller class needs modal and view to communicate

function Controller(m,v){
    this.view = v;
    //console.log(this.view.display);
    this.modal = m;
    this.modal.addObserver(this);

    this.updateView = function(){
        // update the view
        //console.log(this.view);
        this.view.display();
    };
    this.notify = function(){
        // state has changed
        this.updateView();
    };
}

// Test
var modal = new Modal();
var consoleView = new View(modal);
var controller = new Controller(modal,consoleView);
// change the state of the modal
for ( var i = 0 ; i < 10; i++){
    consoleView.pressButton();
}

Приведенный выше пример демонстрирует использование работы с кадрами MVC, где модальное изображение поддерживается независимо от вида и контроллера. Модал, представляющий данные, отвечает за уведомление всех заинтересованных сторон, которые проявили интерес и зарегистрировались в модале. Как только происходит какое-либо изменение, сторонам отправляется уведомление, и на них остается действие. Пример ниже немного отличается от приведенного выше, где наблюдатель показывает только новые данные.

    function Modal(){
var stateChanged =  false;
var listeners = [];
var data = ["JS is object based language"];
// To retrieve the data
this.getData = function(){
    return data;
};
// To change the data by any action
this.modifyData = function (string) {
    ( data.length === 1 )? data.push(string): data.unshift(string);
    stateChanged = true;
    notifyAllObservers();
};

// Notifies all observers
function notifyAllObservers (){
var i;
    for(i = 0; i < listeners.length; i++){
        listeners[i].notify();
    }
}
// Requires to register all observers
this.addObserver = function (listener){
    listeners.push(listener);
};
}
// View is created with modal
function View(m) {
    this.modal = m;
    this.display = function () {
    console.log("****************************************************");
        var data = this.modal.getData();
        console.log(data[0]);
    console.log("****************************************************");
    };
    //Adding external simulation of user sending input 
    this.pressButton = function(string){
        // change the state of modal
        this.modal.modifyData(string);
    };
}

// View class

function Controller(m,v){
    this.view = v;
    this.modal = m;
    this.modal.addObserver(this);

    // Updates the view
    this.updateView = function(){
        this.view.display();
    };
    // When notifies by the modal send the request of update 
    this.notify = function(){
        // state has changed
        this.updateView();
    };
}

// Test
var modal = new Modal();
var consoleView = new View(modal);
var controller = new Controller(modal,consoleView);
consoleView.pressButton();
consoleView.pressButton("JS dominates the web world");
consoleView.pressButton("JQuery is a useful library of JS");

Последнее, что можно добавить, это удалить наблюдателя, когда он не нужен. Это можно сделать, добавив метод с именем removeObserver(object) в модальные вызовы. Приведенный выше шаблон проектирования MVC может быть более усовершенствован с помощью подкассировки и наличия общей функции, присутствующей в высшем классе, что делает проект максимально простым, но он оставлен в другой статье. Надеюсь, это поможет.

1 голос
/ 14 декабря 2011

MVC - это шаблон проектирования, который следует использовать для структурирования вашего приложения.MVC расшифровывается как Model, View, Control.По сути, это означает, что вы должны отделить свою бизнес-логику (модель) от пользовательского интерфейса (представление) и управляющей логики.

Например:

У вас есть пользовательский класс, который загружаетпользователи из базы данных, могут сохранить их.Это ваша модель.

У вас есть контроллер, который использует класс User для входа пользователя.

После завершения работы контроллера он отображает шаблон, содержащий текст «Welcome $ username».

Кроме того, модель не должна знать о представлении и контроллере, представление не должно знать о контроллере, в то время как контроллер знает о модели и представлении.

Википедия на MVC: http://de.wikipedia.org/wiki/Model_View_Controller

0 голосов
/ 14 декабря 2011

Я думаю, вы упускаете из виду суть.

MVC - это шаблон, который вы бы использовали для разработки приложения.Я думаю, что как минимум вы ожидаете, что сможете изменить модель, и увидите изменение, отраженное в представлении.

Обычно у вас есть объект для представления модели, другой объект для представления«представление» (которое, вероятно, является посредником между моделью и объектами HTML, которые вы используете в качестве представления) и контроллер, который будет принимать входные данные от ваших объектов HTML и обновлять модель.

Таким образом, вы меняетеполе редактирования, поле редактирования сообщает контроллеру, контроллер обновляет модель, модель генерирует события, которые контроллер использует для обновления любых других компонентов представления, которые зависят от этих данных.

Было бы еще несколькоСтроки для реализации версии «Привет мир», но я думаю, что это то, что я бы искал из такого вопроса на собеседовании.

...