构建浏览器游戏我从 PHP 转向 JavaScript,现在我也想在服务器端使用它。由于我将要求用户使用 JavaScript,因此我将广泛使用它。我想以面向对象的方式使用 in。
考虑到 MVC,模型将用于客户端和服务器端。视图仅在客户端使用。该界面分为多个部分:主侧菜单、主要内容和一些小部件。我将以我已经完成的部分为例:菜单分为三个类别,具有多个条目。每个条目都是一个带有附加操作的链接(例如切换内容)。
// menuview:
var self = new View();
var generalMenu = new MenuCategory('generalmenu')
.addEntry(new MenuEntry('overview', new Action()))
.addEntry(new MenuEntry('buildings'))
.addEntry(new MenuEntry('resources'))
// [..more categories..]
self.toData = function() {
return {
id: this.id,
cat: [generalMenu.toData(), infosMenu.toData(), userMenu.toData()]
};
};
目前 View 是一个带有 toData() 方法的组合,用于为模板解析器创建数据(自制,简单但支持迭代)。并且操作在创建后附加。我使用 jQuery 作为框架:
self.show = function(callback) {
$tpl(this.tpl).parse(this.toData()).lang('main').toHTML(function(html) {
var el = $(html);
el.find('a').click(function (e) {
MenuEntry.actionHandler.execAction(e.target.id);
return false;
});
el.appendTo('#'+self.target);
callback && callback();
});
return this;
};
我已经声明了一个 actionhandler 以避免遍历链接。
我对这个解决方案感觉不舒服,它不够灵活。我想把一个视图当作一个真正的组合,而不是有很多奇怪的依赖。另外,如果我改变了一部分,我必须重新解析整个视图。好吧,在这个例子中这并不明显,因为菜单在运行时不会改变,但界面的其他部分会。
现在,终于要回答我的问题了:有更好的解决方案吗?就像 dom 引用分布在视图上一样,每个菜单条目都有自己的引用和直接附加的操作?如果我不再使用模板,我会失去什么样的灵活性?