这完全是一个最佳实践类型的问题,因此语言无关紧要。我了解 MVC 的基本原理,并且它有不同的微妙风格(即直接引用模型的视图与来自控制器的数据委托)。
我的问题是关于跨 MVC 通信,当这些 MVC 嵌套时。这方面的一个例子是绘图程序(如 Paint 或其他东西)。Canvas 本身可以是 MVC,但每个绘制的实体(例如 Shapes、Text)也可以。从模型的角度来看,拥有一个实体集合是有意义的CanvasModel
,但是 和 应该CanvasView
分别CanvasController
拥有相应的实体视图和控制器集合吗?
另外,添加新绘制实体的最佳/最干净的方法是什么?假设用户激活了 CircleTool,他们在 Canvas 视图中单击并开始绘制形状。CanvasView
可以触发CanvasController
可以侦听的相关鼠标向下/移动/向上事件。然后控制器基本上可以将这些事件代理到 CircleTool(状态模式)。在鼠标按下时,CircleTool 会想要创建一个新的 Circle。该工具应该直接创建一个新的CircleEntityController
并调用类似的东西canvasController.addEntity(circleController)
吗?那么创建 Circle 的模型和视图的责任应该在哪里呢?
对不起,如果这些问题有些模糊:)
--编辑--
这是我正在谈论的伪代码示例:
CircleTool {
...
onCanvasMouseDown: function(x, y) {
// should this tool/service create the new entity's model, view, and controller?
var model = new CircleModel(x, y);
var view = new CircleView(model);
var controller = new CircleController(model, view);
// should the canvasController's add method take in all 3 components
// and then add them to their respective endpoints?
this.canvasController.addEntity(model, view, controller);
}
...
}
CanvasController {
...
addEntity: function(model, view, controller) {
// this doesn't really feel right...
this.entityControllers.add(controller);
this.model.addEntityModel(model);
this.view.addEntityView(view);
}
...
}