当我从菜单更改联系人时,我正在尝试有条件地更新几个联系人字段,但无法使其正常工作。我尝试了几种方法,但没有一种方法能很好地显示代码示例。
这是我的业务规则:
初始化:
- 加载联系人列表。每个联系人都有一个 ID、姓名、电子邮件和电话。
- 加载当前选择的联系人 ID。使联系人菜单选择相应的联系人。
- 加载初始电子邮件值 - 这可能与所选联系人的电子邮件不同,因为它可能已被覆盖并保存。
- 加载初始电话值 - 这可能与所选联系人的电话不同,因为它可能已被覆盖并保存。
过程:
- 允许用户更改当前选定联系人的电子邮件或电话。这不会更改联系人对象上的基础电子邮件或电话;相反,它是一个覆盖值。
- 如果用户从菜单中选择了不同的联系人,则显示该联系人对象的电子邮件和电话,替换之前的值。之前的规则仍然适用:然后用户可以覆盖新选择的联系人的电子邮件或电话值,并且该覆盖值应该保留,除非用户从菜单中选择不同的联系人。
坚持:
- 保存时,发送当前选择的联系人ID、邮箱当前值、联系人当前值。
这是我的一些代码:
查看型号:
function ContactViewModel( initialData ) {
var self = this;
// not sure I need Contacts to be an observable; I think I can use a plain array
self.Contacts = ko.observableArray([]);
self.SelectedContactId = ko.observable( null );
self.ContactEmail = ko.observable( null );
self.ContactPhone = ko.observable( null );
// ...
self.init() {
// load the contacts list
ko.utils.arrayForEach( initialData.Contacts, function( item ) {
self.Contacts.push( { item.Id, item.Name, item.Email, item.Phone } );
});
// load the selected contact, email and phone
if ( initialData.ContactInfo != null ) {
self.SelectedContactId( initialData.ContactInfo.Id );
if ( initialData.ContactInfo.Email != null
&& initialData.ContactInfo.Email.length > 0 ) {
self.ContactEmail( initialData.ContactInfo.Email );
}
if ( initialData.ContactInfo.Phone != null
&& initialData.ContactInfo.Phone.length > 0) {
self.ContactPhone( initialData.ContactInfo.Phone );
}
}
}
self.init(); // initialize!
}
标记:
<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" />
似乎我需要一个或两个计算出的 observableContactEmail
来ContactPhone
检查是否SelectedContactId
已更改,如果已更改,则从新选择的联系人加载电子邮件和电话。但是我一直在兜圈子,试图让SelectedHomeownerId
保存以前选择的 ID,并试图让ContactEmail
检查当前联系人 ID 是否与以前的 ID 不同,然后显示当前联系人的电子邮件。这些功能会是什么样子?