有没有人能够使用任何 javascript 框架实现 MVP 模型?我无法弄清楚如何让演示者 -> 查看从服务器代码到 javascript 的反转。我有一些想法,但有点老套,想看看其他人在做什么。
10 回答
MVP 的主要目标是解耦代码中的不同方面。通常,在 JavaScript 中,主要有 3 个这样的方面:
- 事件处理
- DOM 操作
- 服务器通信(AJAX 调用)
对于这些问题中的每一个,MVP 都有一个相应的术语:
- 事件处理 = 演示者
- DOM 操作 = 视图
- AJAX 调用 = 模型
由于确实实现这 3 个方面并不总是那么简单,因此 EVENT BUS 可能会派上用场。该总线应该是单例的,并且在各种上下文中引发的所有事件都应该在总线上发布。Presenter 需要注册它的事件并在事件发生时做出相应的反应。
以下是它的工作原理:
首先发生的是页面加载。使用普通的事件模型或 jQuery 或任何方便的方法来收听这个。创建模型、视图和演示者。Presenter 需要持有 View 和 Model 实例,因为他要使用它们。
var model = new Model();
var view = new View();
var presenter = new Presenter(model, view);
请记住,Presenter 是事件处理程序,因此总线应该知道它并将事件路由到它以进行处理:
bus.registerHandler(presenter);
第一个事件是“init”,这意味着页面已经加载并且 MVP 对象都已设置:
bus.init(); // call this yourself
这将触发 Presenter 中的某些内容,例如函数。我更喜欢 on... 命名约定,在此示例中为 presenter.onInit()。这提供了安装 UI 侦听器的机会:
// in the Presenter
onInit: function() {
view.addSubmitListener();
view.addWhateverListener();
...
}
// in the View (using jQuery)
addSubmitListener: function() {
$("#submitButton").click(function() {
var formData = ...
bus.submit(formData); // publish an event to the bus
});
}
单击提交按钮时,会调用 bus.submit(formData) 并将其路由到处理程序 --presenter.onSubmit(formData):
// in the Presenter
onSubmit: function(formData) {
model.postForm(formData, function(data) {
// handle the response
view.updateSomething(data);
});
}
等等......整个技巧是将总线绑定到演示者,然后你就进入了循环。
高温高压
看看knockout.js,它是一个用于您的网页的 MVVM 框架。它提供了一个非常漂亮且易于扩展的框架,用于以松散耦合的方式链接模型和视图。
在http://angularjs.org/上查看 angular 项目,并随时在邮件组提出任何问题。
它旨在与 jQuery 一起工作。对于编写可测试的 MVC JS 应用程序非常有用。
我知道这个问题很老,但我认为这里值得一提。我投票给 Backbone.js。甚至文档都说它是 MVC,我会说它是 MVP。
- VIEW = html 模板 (jQuery.template)
- 模型 = 骨干. 模型
- PRESENTER = Backbone.View(您的视图模板之间的层以及如何将数据绑定到它,以及您可以做的更多事情)以及您可以在渲染方法中使用什么最好的视图(html模板)或切换使用哪个.. .
什么是最好的你仍然有控制器
- CONTROLLER = Backbone.Controller
替代方案可能是@JoshRivers 提到的,knockoutJS,但我个人认为视图模板被绑定的东西淹没了。
最后一点。事情是来自 MVC 或 MVP 的 View as V 是可以从您的模板构建而无需编码的东西,制作好的 HTML 模板解析器,你很高兴 :) 相信我,约定是你的朋友。
检查PureMVC。他们还移植到 JavaScript。
另一个,对于 jQuery 人:http: //javascriptmvc.com/
请注意,Ext JS 从 4.0 版开始也支持 MV(x) 模式,我将作为前 Ext 人员提及。像大多数框架一样,它们也将其称为“MVC”(JS 世界中的大多数人都是如此,请参阅TodoMVC,而不是 TodoMVP)。但是从实际的角度来看,Ext 中的工具可以实现模式的 C/P 部分,以最适合您的需要。模式很有用,但像大多数东西一样,当教条主义地对待时,它会限制你的思维。
看看Riot.js - 一个全新的、独立的 1kB (!) MVP 微型库,它拥有构建可扩展的模块化 JavaScript 应用程序所需的一切。还有一个完整的演示。
正在搜索 MVP 框架的一些示例,并遇到了这个链接,这对于决定一个想要使用的框架可能非常有用: MV* Frameworks
似乎谷歌 GWT 使用 MVP:
我们在这里谈论MVP!不是MVC!我认为这个行业还没有为 MVP 做好准备。大家还在努力掌握MVC。