2

我目前正在使用 strophe.js、backbone.js 和 wijmo(基于 jquery UI 的 UI 库)并在聊天界面上工作。我有两个对话框,一个是联系人列表,另一个是聊天容器。聊天将使用经典的 jquery UI 标记组织在选项卡中:

<div id="tabs">
    <ul>
        <li><a href="#tabs-1">Chat 1</a></li>
        <li><a href="#tabs-2">Chat 2</a></li>
        <li><a href="#tabs-3">Chat 3</a></li>
    </ul>
    <div id="tabs-1"><!-- Content chat 1 --></div>
    <div id="tabs-2"><!-- Content chat 2 --></div>
    <div id="tabs-3"><!-- Content chat 3 --></div>
</div>

每个单独的聊天容器都将包含一个参与者列表(多用户聊天)、消息和一个表单。

作为 Backbone 和 underscore 的新手,我想知道处理这个问题的最佳方法是什么。我从一个聊天模型、一个聊天集合、一个聊天视图和一个聊天列表视图开始,但我找不到合适的方法来呈现选项卡并使其保持更新。

有任何想法吗 ?

4

1 回答 1

3

使用路由器。

为聊天创建一个 View 类。每个聊天都会有自己的视图和自己的选项卡。更新时,视图的 render() 函数会更新聊天,即使它对用户不可见。

我用于管理选项卡的代码如下所示:

hide: ->
    if @el.is(":visible") == false
        return null
    $('#' + @id + '-tab').removeClass('activetab').addClass('inactiveTab')
    $.Deferred((dfd) =>
        @el.fadeOut('fast', dfd.resolve)
    ).promise()

show: ->
    if (@el.is(':visible'))
        return
    $('#' + @id + '-tab').removeClass('inactiveTab').addClass('activetab')
    $.Deferred((dfd) =>
        @el.fadeIn('fast', dfd.resolve)
    ).promise()

这就是视图中的内容。每个视图都有一个 slugified 名称。请注意 jQuery 库“Deferred”的使用。我稍后再讨论。

在您的路由器中,定义聊天路由:

    'chat/:chatid': 'switchOrStartChat'

和方法:

    fadeAllViews: () ->
        _.select(_.map(@views, (v) -> v.hide()), (t) -> t != null)

     switchOrStartChat: (chatid) ->
          chat = @views[chatid] ||= new ChatView({chatid: chatid})
          $.when.apply(null, this.fadeAllViews()).then(() -> view.show())

当然,您可以进一步概括这一点,但想法是,每当您切换选项卡时,您只需切换一个方法以隐藏所有可见的内容,然后(延迟确保这以正确的顺序发生)显示不是的一件事. 选项卡由每个视图维护;您将不得不做一些小问题,因为它们可能会在视图维护的实际 DIV 之外,但这很简单。您必须为您的选项卡对象编写一个单独的模板来创建具有包含您的chatidslug 的 ID 的选项卡 DOM 对象,但这很容易管理。

我写了一篇关于这种单页设计的教程:The Backbone Store(链接到 Javascript 版本,虽然我现在是咖啡脚本党派),我还讨论了使用这种技术来查找和修改基于 slug 的导航选项卡、面包屑等辅助工具。

于 2011-09-26T20:39:06.587 回答