Объяснить MVC-архитектуру extjs

Я создал небольшое приложение sudoku с помощью Javascript. Теперь я пытаюсь преобразовать этот код javascript в код extjs (4.1.1a). Я просмотрел docs, чтобы понять архитектуру MVC, но для меня это было не так подробно, как новичок.

Может кто-нибудь объяснить архитектуру MVC Extjs на основе моего приложения Sudoku?

Дизайн моего кода приложения sudoku выглядит следующим образом:

enter image description here

Описание приведенной выше конструкции выглядит следующим образом:

  • container (blue) --> parent panel (grey) --> child panel (red)

  • "Панели родителей" - девять, и каждая "родительская панель" имеет девять "дочерних панелей".

  • HTML-элементы "родительских панелей" и "дочерние панели" генерируются динамически, используя для циклов.

  • Я написал такие события, как KeyDown события и click события на "дочерних панелях".

  • Я также написал некоторые функции, такие как

    checkGroup()       → проверяет в каждой "родительской панели", есть ли дублирующие номера checkVertical()     → проверяет в каждой вертикальной строке "контейнер" для повторяющихся номеров checkHorizontal() → проверяет в каждой горизонтальной строке "контейнер" для повторяющихся номеров


EDIT: (незавершенный и неструктурированный код)

app.js (основной файл js)

Ext.application({
     name: 'Game',
     appFolder: 'app',  
     controllers: ['Sudoku']     
});

контроллер (папка "приложение" → папка "контроллер" → Sudoku.js)

//By using 'controller', trying to call 'view' here
Ext.define('Game.controller.Sudoku', {
    extend: 'Ext.app.Controller',

    init: function () {
        console.log("controller init");
    },
    onLaunch: function () {
        console.log("controller onLaunch");
    },
    views: ['Sudoku']
});

просмотр (папка "приложение" → "просмотр" → Sudoku.js)

Ext.define('Game.view.Sudoku', {
    extend: 'Ext.window.Window',  //what should I extend here for view?       
    initComponent: function () {
        //my complete sudoku js file here
        console.log("hello");
    }
});

Ответ 1

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

Контроллер создаст представление container as и может передать ему некоторые параметры конфигурации, не беспокоясь о других вложенных панелях. Контроллер может также прослушивать события этого container как кнопка, которая заканчивает игру или сохраняет игру.

MVC не означает, что вы должны передать все события и логику в контроллер.

Даже если это, на ваш взгляд, довольно сложно, это все еще просто взгляд.

Ответ 2

Во-первых, вы должны хорошо понимать, как работает MVC, прежде чем пытаться его реализовать, особенно в Ext JS с поддержкой MVC в последней версии.

Говоря в общем смысле (поскольку вы единственный, кто действительно знает ваш код), я бы разделил код как таковой:

  • Модель: матрица 9x9 значений данных (или матрица 3x3 матриц 3x3), метод проверки, который определяет, разрешена ли головоломка или имеются ли какие-либо ошибки в пользователе ввод (например, два 6 в поле) и, возможно, поддержка отмены.

  • Вид. Ваш контейнер выше. Контроллер не должен понимать, как контейнер отображает значения. Я бы, вероятно, отправил свои собственные события, специфичные для судоку, такие как cellchanged(container, x, y, newValue, oldValue) и undo(container).

  • Контроллер: прослушивает события, специфичные для sudoku, в представлении и соответственно обновляет модель. После каждого обновления проверяет модель, чтобы определить, была ли головоломка решена или определенные ячейки неверны. Не должен выступать в качестве реле для всех событий просмотра. Такие события, как render и resize, не относятся к контроллеру судоку. Только слушайте, что вам действительно нужно.