使用 Backbone.js 渲染选项卡 (jquery ui)下划线.js

发布于 2024-12-06 15:59:22 字数 800 浏览 2 评论 0原文

我目前正在使用 strope.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 & 相当陌生。下划线,我想知道处理这个问题的最佳方法是什么。我从聊天模型、聊天集合、聊天视图和聊天列表视图开始,但我没有找到渲染选项卡并保持更新的正确方法。

有什么想法吗?

I'm currently playing with strophe.js, backbone.js & wijmo (UI library based on jquery UI) and working on a chat interface. I have two dialog boxes, one is the contacts list, the other one will be the chat container. Chat will be organized in tabs with the classic jquery UI markup:

<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>

Each individual chat container will contain a participants list (multi-user chat), the messages and a form.

Being fairly new to Backbone & underscore, I'm wondering what's the best way to handle this. I started with a Chat model, a Chats collection, a chat view and a chat list view but I don't find a proper way to render the tabs and keep it updated.

Any ideas ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情话难免假 2024-12-13 15:59:23

使用路由器。

创建一个用于聊天的视图类。每个聊天都会有自己的视图和选项卡。更新时,视图的 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 之外,但这非常简单。您必须为选项卡对象编写一个单独的模板,以创建带有包含 chatid slug 的 ID 的选项卡 DOM 对象,但这很容易管理。

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

Use a router.

Create a View class for a chat. Each chat will get its own view and its own tabs. On update, the render() function for the view updates the chat, even if it's not visible to the user.

The code I use for managing tabs looks like this:

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()

This is what goes into the view. Each view gets a slugified name. Note the use of "Deferred," the jQuery library. I'll discuss that later.

In your Router, define a route for chats:

    'chat/:chatid': 'switchOrStartChat'

And the methods:

    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())

You can generalize this further, of course, but the idea is that whenever you switch tabs, you just toggle a method to hide everything that's visible, and then (the Deferred makes sure this happens in the right order) show the one thing that's not. The tabs are maintained by each view; you'll have to do a little finagling as they'll probably be outside the actual DIV maintained by the View, but that's pretty simple. You'll have to write a separate template for your tab objects to create tab DOM objects with IDs that contain your chatid slug, but that's easily managable.

I wrote a tutorial on this kind of one-page design: The Backbone Store (link goes to the Javascript version, although I'm a coffeescript partisan these days), where I also discuss using this technique to find and modify slug-based navigation aids such as tabs, breadcrumbs, and the like.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文