0

我正在构建一个包含两个主要组件的简单聊天应用程序:对话(convos)和用户。

用户具有以下属性:id, name,status

Convos 具有以下属性:id, name,users

在 convos 中,users是参与observableArray该convoid的用户中的一个。

我的目标是在 convos 视图中列出用户(按名称),但我正在寻找关于两个项目的一些指导:

  1. users通过从 convos viewModel 中的各自访问 viewModel 来列出用户的最佳方式id

  2. 如何保持关联,以便(例如)用户将其状态从其所在的任何 convo 上的状态更改active为更新 viewModel。awayid

在这一点上,我已经有了 viewModel,但仅此而已,我希望有人可以提供一些指导或示例,说明如何(可靠地)实现这一点。

4

2 回答 2

1

通常你会做这样的事情(假设是一个包含条目Convos的顶级):observableArrayConvo

<ul data-bind="foreach: Convos">
  <li>Conversation <span data-bind="name"></span>
     <ul data-bind="foreach: users">
        <li><span data-bind="text: name"></span> has status
            <span data-bind="text: status"></span>
        </li>
     </ul>
  </li>
</ul>

由于所涉及的一切都是可观察的,因此对例如用户状态的任何更改都会自动更新显示(就像添加/删除用户或 convo 一样)。

于 2013-10-12T19:21:28.747 回答
1

答案可能是不在convos 视图模型中按 ID 列出用户。而是通过引用列出实际用户。这将使您的两个问题都消失,因为 Knockout 将为您处理绑定(如果需要,双向)。

这是我的意思的一个例子:

var User = function(id,name,status) {
    this.id = ko.observable(id);
    this.name = ko.observable(name);
    this.status = ko.observable(status);
};

var Convo = function(id,name,users) {
    this.id = ko.observable(id);
    this.name = ko.observable(name);
    this.users = ko.observableArray(users);
};

var john = new User(1,'john','active');
var mary = new User(2,'mary','inactive');
var marcus = new User(3,'marcus','active');

var convo1 = new Convo(1, 'dinner', [john,mary]);
var convo2 = new Convo(2, 'birth day party tomorrow', [john,mary,marcus]);

这样,如果您在对话中的某处引用用户的状态,它将自动与您的视图模型保持同步。

有关我的意思的演示,请参阅this fiddle 。

于 2013-10-12T15:45:04.323 回答