【问题标题】:Explain MVC architecture of extjs讲解extjs的MVC架构
【发布时间】:2013-01-24 05:28:46
【问题描述】:

我使用 Javascript 创建了一个小型数独应用程序。现在我正在尝试将该 javascript 代码转换为 extjs (4.1.1a) 代码。我已经通过docs 了解了MVC 架构,但对于我是初学者来说,它似乎并不那么详细。

有人可以根据我的数独应用解释 Extjs 的 MVC 架构吗?

我的数独应用代码设计如下:

以上设计说明如下:

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

  • 父面板”有九个,每个“父面板”有九个“子面板”。

  • 父面板”和“子面板”的 HTML 元素是使用 for 循环动态生成的。

  • 我在“子面板”上编写了诸如KeyDown 事件和click 事件之类的事件。

  • 我也写了一些函数,比如

    checkGroup()       --> 检查每个“父面板”中是否有重复的数字 checkVertical()     --> 在“容器”的每一垂直行中检查重复数字 checkHorizo​​ntal() --> 检查“容器”的每一水平行是否有重复数字


编辑:(未完成和非结构化代码

app.js主 js 文件

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

controller('app' 文件夹 --> 'controller' 文件夹 --> 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']
});

查看('app' 文件夹 --> 'view' 文件夹 --> 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");
    }
});

【问题讨论】:

  • 您需要一个数独控制器,但已将其命名为 users...
  • @sra 抱歉打错了,我改了。尽管我在我的 chrome 控制台中看不到“你好”。如文档中所述,我扩展了控制器和视图。我在这里做对了吗?
  • @sra 我不知何故进入了控制器部分。 (显示控制器的消息)。现在它只是不显示“查看”消息,即“你好”。我不明白我哪里出错了。
  • 你需要告诉控制器他应该做什么。例如,当他加载时加载您的视图。为此,您可以使用 refs(还有其他一些方法,但我认为 refs 在您的情况下是最简单的)注意在调用它们之前定义 refs。
  • @sra 你能告诉我在哪里给 ref(ref 似乎是私人的)吗?我什至在sencha forums 上问过同样的问题

标签: extjs extjs4 extjs4.1 extjs-mvc


【解决方案1】:

首先,在尝试实现 MVC 之前,您应该充分了解 MVC 的工作原理,尤其是在最新版本中添加了 MVC 支持的 Ext JS 中。

从一般意义上讲(因为您是唯一真正了解您的代码的人),我将代码分开:

  • 模型:数据值的 9x9 矩阵(或 3x3 矩阵的 3x3 矩阵),一种确定谜题是否已解决或用户是否有任何错误的验证方法输入(例如,一个框中的两个 6),并可能撤消支持。

  • 查看:上面的容器。控制器应该不知道容器如何显示值。我可能会发送我自己的数独专用事件,例如 cellchanged(container, x, y, newValue, oldValue)undo(container)

  • 控制器:监听视图中的数独特定事件并相应地更新模型。每次更新后,验证模型以查看谜题是否已解决或某些单元格是否不正确。不应充当所有视图事件的中继。 renderresize 之类的事件与数独控制器无关。只听你真正需要的。

【讨论】:

  • 很好的解释。但是模型也绑定到视图。继电器遍及控制器是反分离的。但总的来说 +1
  • 我从不喜欢让模型与视图对话。我想我的解释更像是表示抽象控制而不是真正的 MVC。但是有一点你必须停止担心架构语义,只需编写该死的东西。 +1 回你。
  • 请看我的帖子编辑。我添加了我是如何做到的。代码甚至没有显示任何类型的错误。我在调用函数时哪里出错了?
【解决方案2】:

就我对您的应用的了解,我几乎无话可说。您有一个非常具体的视图,其中包含一些不应该打扰控制器的侦听器和操作。

控制器会创建container 作为视图,并且可以将一些配置选项传递给它,而不会过多地打扰其他嵌套面板。控制器还可以侦听此container 的事件,例如结束游戏或保存游戏的按钮。

MVC 并不意味着您会将所有事件和逻辑传递到控制器中。

即使您认为这很复杂,它仍然只是一个视图。

【讨论】:

  • 你能解释一下模型是做什么的吗? (仅供参考)
  • @Mr_Green 嗯,ExtJS 采用的方法很好,但它实际上并不是理解 MVC 模式的方法。请阅读此Article on Wikipedia 或来自Article from Microsoft 以更深入地了解该模式
  • 请看我的帖子编辑。我添加了我是如何做到的。代码甚至没有显示任何类型的错误。我在调用函数时哪里出错了?
  • 嗨,我通过为视图提供别名并在控制器中调用该别名来解决了这个问题。 :)
  • @Mr_Green 这是一种方式(顺便说一句。你应该总是定义一个别名!)。 Refs 可以帮助您管理视图的访问和实例,例如自动创建、单例、...它是一个包装器,可以在为您封装这些部分的同时节省您的代码行数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-05-01
相关资源
最近更新 更多