我正在建立一个网站,其中许多网页都是非常互动的,无需与网络服务器进行任何通信。基本上,页面代表一种DHTML界面,用户可以点击各种 divs 来移动它们并执行其他操作。最后,用户可以在屏幕上保存所有div的“状态”,然后才将HTTP请求发送到服务器。
我正在尝试使用MVC方法(通过CodeIgniter),这些操作主要由JQuery和我编写的一些自定义JavaScript函数处理。我有很多涵盖逻辑的JavaScript代码。目前,所有代码都在CodeIgniter的MVC的 View 中,但我觉得这是错误的。我想我应该将一些代码移动到某种控制器,但是一个JavaScript而不是CI提供的PHP控制器。
我应该在JavaScript中创建某种并行MVC吗?
答案 0 :(得分:3)
顺便说一句,在JavaScript中实现业务逻辑代码时需要注意的另一件事是,您运行的代码在应用程序的信任边界之外运行 - 也就是说,因为它在每个客户端上运行,所以从技术上讲,客户端可能会向您发送错误数据。这可能是一个大问题,特别是如果你在前端有授权逻辑。
不知道你的代码是什么,我会说你想要完全从JS中获取需要高度信任的代码。保存JS用于UI糖。如果你这样做,在你的“视图”中有很多JS代码是完全可以接受的 - 只要它只涉及操纵客户端表示。
但是,是的,另一方面,我确实看到你如何将这种努力视为模型 - 视图 - 控制器(客户端) - 控制器(服务器)模式。但我认为没关系......
答案 1 :(得分:2)
如果您最终拥有大量的Javascript代码并且大多数功能都在运行客户端,那么服务器端也无济于事。您需要很好地组织JQuery和其他JavaScript代码。不确定是否存在专门针对JavaScript的任何MVC框架。几年前我曾经有一个与大量JavaScript一起工作的项目。 然而,您不一定需要完成全面的MVC,只需要有简单的模型,并且逻辑处理器(控制器)可以为您提供很多帮助。 但是,如果你的代码依赖于JavaScript,那么如果你真的不知道如何构建你的JavaScript软件,这就是一个双重错误。
答案 2 :(得分:1)
JavaScriptMVC是组织和开发大型JS应用程序的绝佳选择。
架构设计非常务实。您将使用JavaScript做4件事:
JMVC将这些分为模型,视图,控制器模式。
首先,也许最重要的优势是控制器。控制器使用事件委派,因此您只需为页面创建规则,而不是附加事件。它们还使用Controller的名称来限制控制器的工作范围。这使得您的代码具有确定性,这意味着如果您在'#todos'元素中看到事件发生,您就知道必须有一个todos控制器。
$.Controller.extend('TodosController',{
'click' : function(el, ev){ ... },
'.delete mouseover': function(el, ev){ ...}
'.drag draginit' : function(el, ev, drag){ ...}
})
接下来是模特。 JMVC提供了一个强大的类和基本模型,使您可以快速组织Ajax功能(#2)并使用特定于域的功能(#3)包装数据。完成后,您可以使用控制器中的模型,如:
Todo.findAll({after:new Date()},myCallbackFunction);
最后,一旦你的待机回来,你必须展示它们(#4)。这是您使用JMVC视图的地方。
'.show click' : function(el, ev){
Todo.findAll({after: new Date()}, this.callback('list'));
},
list : function(todos){
$('#todos').html( this.view(todos));
}
在'views / todos / list.ejs'
中<% for(var i =0; i < this.length; i++){ %>
<label><%= this[i].description %></label>
<%}%>
JMVC提供的不仅仅是架构。它可以帮助您完成开发周期的一部分:
答案 3 :(得分:0)
你可以。看看Asset Helper。它允许您设置任何类型的结构,而不会干扰CodeIgniter的结构。它设置了一种资产区域,您可以根据需要设置自己的模块。不过,你可能会想到一种不同的分离方式,因为Javascript可能主要处理View,特别是如果你没有使用AJAX。因此,考虑将您的javascript(一个Java)打包到具有逻辑分组的单独文件夹中。然后,使用资产助手,它只是一个简单的PHP行,告诉你的程序使用你想要的任何东西。