模板与DOM创建 - 高度动态的界面

时间:2010-01-30 17:25:23

标签: javascript templates dom-manipulation

构建一个browsergame我从PHP到JavaScript,我现在也想在服务器端使用它。 由于我要求用户使用JavaScript,我将广泛使用它。我想以面向对象的方式使用。

考虑到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;
};

我已经声明了一个动作处理程序,以避免迭代链接。

我对这个解决方案感觉不舒服,它不够灵活。我想将视图视为真实的组合,而不是许多奇怪的依赖。另外,如果我改变一个部分,我必须重新整理整个视图。好吧,在这个例子中,这并不明显,因为菜单在运行时不会改变,但界面的其他部分会。

现在,最后回答我的问题:有更好的解决方案吗? 就像在视图中传播dom引用一样,每个菜单都有它自己的引用和直接附加动作?如果我不再使用模板,我会失去什么样的灵活性?

1 个答案:

答案 0 :(得分:1)

我决定不使用模板解析器。每个视图都存储它的节点,并且如果它被告知更新数据,则能够直接操作它。