Javascript 淘汰:如何根据下拉列表有条件地显示和存储值?

Javascript 淘汰:如何根据下拉列表有条件地显示和存储值?,javascript,mvvm,knockout.js,knockout-2.0,Javascript,Mvvm,Knockout.js,Knockout 2.0,当我从菜单中更改联系人时,我试图有条件地更新几个联系人字段,但无法使其正常工作。我尝试过几种方法,但都没有 工作良好,甚至可以显示代码示例 以下是我的业务规则: 初始化: 加载联系人列表。每个联系人都有Id、姓名、电子邮件和电话。 加载当前选择的联系人Id。使“联系人”菜单选择相应的联系人。 加载初始电子邮件值-这可能与所选联系人的电子邮件不同,因为它可能已被覆盖和保存。 加载初始电话值-这可能与所选联系人的电话不同,因为它可能已被覆盖和保存。 过程: 允许用户更改当前选定联系人的电子邮件或电话

当我从菜单中更改联系人时,我试图有条件地更新几个联系人字段,但无法使其正常工作。我尝试过几种方法,但都没有 工作良好,甚至可以显示代码示例

以下是我的业务规则:

初始化:

加载联系人列表。每个联系人都有Id、姓名、电子邮件和电话。 加载当前选择的联系人Id。使“联系人”菜单选择相应的联系人。 加载初始电子邮件值-这可能与所选联系人的电子邮件不同,因为它可能已被覆盖和保存。 加载初始电话值-这可能与所选联系人的电话不同,因为它可能已被覆盖和保存。 过程:

允许用户更改当前选定联系人的电子邮件或电话。这不会更改联系人对象上的基础电子邮件或电话;相反,它是一个覆盖值。 如果用户从菜单中选择其他联系人,则显示该联系人对象的电子邮件和电话,替换以前的值。之前的规则仍然适用:用户可以覆盖新选择联系人的电子邮件或电话值,除非用户从菜单中选择其他联系人,否则覆盖值应保持不变。 坚持:

保存时,发送当前选定的联系人ID、电子邮件的当前值和联系人的当前值。 以下是我的一些代码:

视图模型:

标记:


似乎我需要在ContactEmail和ContactPhone上显示一个或两个计算的可观察项,以检查所选ContactId是否已更改,如果已更改,则从新选择的联系人加载电子邮件和电话。但我一直在兜圈子,试图让SelectedHomeownerId保存以前选择的Id,并尝试获取ContactEmail以检查当前联系人Id是否与以前的Id不同,然后显示当前联系人的电子邮件。这些功能是什么样子的?

订阅选定的ContactID更改并根据需要更新属性:

self.SelectedContactId.subscribe(function (contactId){
    // find contact in your lookup:
    // then:
    self.ContactEmail('new value');
    self.ContactPhone('new value');
});

哦,就是这么简单!我以前从未订阅过,所以我一直忽略它。谢谢
<select id="homeowner" data-bind="
    options:        Contacts,
    optionsText:    'Name',
    optionsValue:   'Id',
    optionsCaption: '-- Select a Contact --',
    value:          SelectedContactId
">
</select>

<input id="email" type="text" data-bind="value: ContactEmail" />
<input id="phone" type="text" data-bind="value: ContactPhone" />
self.SelectedContactId.subscribe(function (contactId){
    // find contact in your lookup:
    // then:
    self.ContactEmail('new value');
    self.ContactPhone('new value');
});