您的javaScript代码是如何组织的?它是否遵循MVC等模式?
我一直在做一个辅助项目已经有一段时间了,而且我得到的越多,我的网页就变成了一个功能齐全的应用程序。现在,我坚持使用jQuery,然而,页面上的逻辑正在增长到一些组织,或者我敢说,“架构”是需要的。我的第一种方法是“MVC-ish”:
注意:早些时候我说javaScript“不是真正的OO,不是真正的功能”。我认为,这让每个人分心。让我们这样说吧,因为javaScript在很多方面都是独一无二的,而且我来自一个强类型的背景,我不想强制我所知道的范例,而是用非常不同的语言开发。
答案 0 :(得分:6)
..但Javascript有很多方面 OO。
考虑一下:
var Vehicle = jQuery.Class.create({
init: function(name) { this.name = name; }
});
var Car = Vehicle.extend({
fillGas: function(){
this.gas = 100;
}
});
我已经使用这种技术来创建具有自己状态的页面级javascript类,这有助于保持它(并且我经常识别可以重用并放入其他类的区域)。
当您拥有要执行自己的脚本的组件/服务器控件时,当您在同一页面上有多个实例时,这也特别有用。这使州保持独立。
答案 1 :(得分:3)
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提供的不仅仅是架构。它可以帮助您完成开发周期的一部分:
答案 2 :(得分:2)
MochiKit很棒 - 就js图书馆来说,这是我的初恋,可以这么说。但我发现虽然MochiKit具有非常富有表现力的语法,但对于我来说,它并不像Prototype / Scriptaculous或jQuery那样让我感觉舒适。
我想如果你知道或喜欢python,那么MochiKit对你来说是一个很好的工具。
答案 3 :(得分:1)
非常感谢你的回答。过了一段时间,我想发布到目前为止我学到的东西。
到目前为止,我发现使用Ext之类的方法与JQuery UI,Scriptaculous,MochiKit等其他方法存在很大差异。
使用Ext,HTML只是一个占位符 - UI就在这里。从那时起,所有在JavaScript中进行了描述。在另一个(可能更强大的)API层下,DOM交互最小化。
使用其他工具包,我发现自己从做一些HTML设计开始,然后直接使用时髦效果扩展DOM,或者只是替换这里的表单输入,添加它。
主要的差异开始发生,因为我需要处理事件处理等。由于模块需要彼此“交谈”,我发现自己需要离开DOM,将其抽象化。
我注意到许多这些库也包括一些有趣的模块化技术。 Ext网站提供了非常清晰的描述,其中包括a fancy way to "protect" your code with modules。
我尚未完全评估的新玩家是Sproutcore。它似乎是Ext in方法,其中隐藏了DOM,并且您通常希望处理项目的API。
答案 4 :(得分:1)
Tristan,你会发现当你尝试将JavaScript作为一个MVC应用程序进行体系结构时,它往往会在一个领域 - 模型中出现。最难处理的领域是模型,因为数据不会在整个应用程序中持续存在,并且本质上模型似乎在客户端变得非常一致。您可以标准化从服务器传递和接收数据的方式,但此时模型并不真正属于JavaScript - 它属于您的服务器端应用程序。
我确实看到过一次尝试,有人创建了一个用于在JavaScript中建模数据的框架,就像SQLite属于应用程序的方式一样。它就像Model.select(“Product”)和Model.update(“Product”,“Some data ...”)。它基本上是一个对象表示法,它包含大量数据来管理当前页面的状态。但是,刷新的那一刻,所有数据都将丢失。我可能不在语法上,但你明白了。
如果您使用的是jQuery,那么Ben的方法确实是最好的。使用您的函数和属性扩展jQuery对象,然后划分您的“控制器”。我通常将它们放入单独的源文件中,并逐段加载它们。例如,如果它是一个电子商务网站,我可能有一个JS文件,其中包含处理结帐流程功能的控制器。这往往会使事情变得轻巧且易于管理。
答案 5 :(得分:1)
快速澄清一下。
编写非面向服务器的GWT应用程序是完全可行的。我假设从面向服务器的意味着你需要基于Java的后端的GWT RPC。
我已经在客户端编写了非常“MVC-ish”的GWT应用程序。
如果您的“强类型”背景是使用Java或类似语言,我认为您应该认真考虑大型项目的GWT。对于小项目,我通常更喜欢jQuery。与GWT 1.5一起使用的即将到来的GWTQuery可能会改变这一点,但由于jQuery插件丰富,不会在不久的将来发生。
答案 6 :(得分:0)