JavaScriptMVC:视图如何通知控制器
JavaScript MVC: how do views notify the controller
如果我在JavaScript中遵循粗略的MVC模式,那么视图(例如button
元素)通知控制器的最佳方式是什么?
button
是否应该触发控制器必须侦听的事件?或者,button
应该直接调用控制器函数吗?或者控制器应该将事件分配给视图?
感谢您的意见!
我认为View应该捕获按钮触发的事件,并触发它自己的事件,该事件将由控制器处理。
让我解释一下:
@雷诺斯写道:
控制器监听输入。这意味着控制器监听事件来自DOM节点
就我个人而言,尽管我同意第一种说法,但我不喜欢这种解释。
遵循此语句意味着控制器必须知道UI中的每个按钮/文本字段/元素及其ID/Selector。
我更喜欢View fire语义事件,如"languageSelected"或"searchRequested",并将相关数据添加到事件中。
因此,一个典型的流程是,当用户单击按钮时,View呈现一些UI(比如说它有一个搜索框和一个按钮)-View处理事件并触发自己的"searchRequested"事件。此事件由控制器处理,该控制器将调用模型,要求其执行搜索。完成后,模型将触发一个"searchResultsUpdated"evnet,该evnet将由视图处理,使其显示结果。
如果你现在选择更改应用程序的设计,以显示搜索词链接,而不是搜索框和按钮(或者即使你并排或在不同的屏幕上),那么你唯一需要更改的就是视图。
技术方面的补充说明:如果使用JQuery并假设您的视图是javascript对象,则可以使用
$(view).triggerHandler(
$.Event('eventName',{'object:'with','more':'event','related':'data'})
);
启动事件
和
$(view).on('eventName',handler);
以侦听和处理事件。
有趣的问题。我认为这在很大程度上取决于您的情况、示例的复杂性以及您正在使用的特定JavaScript模式。
如果你谈论的按钮只是一个HTML元素,这可能是一种简单的方式:
var MyController = function() {
this.particularMethod = function() {
// update model
}
// Using jquery
var button = $("#myButton");
button.click( function() { myController.particularMethod() } )
}
或者,如果button
是您创建的对象或模块,您可以设置回调:
var Button = function(selector, clickFunction) {
// Using jquery
$(selector).click(clickFunction)
...
}
var MyController = function() {
this.particularMethod = function() {
// update model
}
var button = new Button("#myButton", this.particularMethod);
...
}
不幸的是,琐碎的例子并不能真正说明不同方法的好处!
有很多方法可以做到这一点。
var app = new App();
function App() {
var model = new Model();
var view = new View();
var controller = new Controller(view, model);
}
function Controller(view, model) {
view.addActionListener(function() {
alert("on activate");
});
}
function View() {
var self = this;
$("button").onclick = function() {
self.listener();
}
}
View.prototype.addActionListener = function(listener) {
this.listener = listener;
}
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 从控制器返回后Ajax启动事件激发
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- 如何在单击复选框后调用控制器方法
- 在控制器和数据对象之间同步数据
- 将Javascript数组发送到控制器ASP.NET MVC
- Firebase2(Firebase.google.com)推送通知-从外部管理
- 角度控制器结构
- 如何在Jquery中发布后将值从视图返回到控制器
- 将值从html传递到AngularJS控制器
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 如何使用 AngularJS 处理文档单击并通知其他控制器
- 推送通知发送到控制器 Angularjs
- AngularJS - $broadcast给控制器的消息会生成重复的通知
- 任何控制器angularjs中的火灾通知烤面包机
- AngularJS方式:通过通知功能扩展控制器/视图
- JavaScriptMVC:视图如何通知控制器
- 在SignalR中使用Angular时,当服务中的对象发生更改时,如何通知控制器
- 如何使用代码点火器在控制器的锚点内显示通知