1

当我从菜单更改联系人时,我正在尝试有条件地更新几个联系人字段,但无法使其正常工作。我尝试了几种方法,但没有一种方法能很好地显示代码示例。

这是我的业务规则:

初始化:

  • 加载联系人列表。每个联系人都有一个 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" />

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

4

1 回答 1

2

根据需要订阅 SelectedContactId 更改和更新属性:

self.SelectedContactId.subscribe(function (contactId){
    // find contact in your lookup:
    // then:
    self.ContactEmail('new value');
    self.ContactPhone('new value');
});
于 2013-05-10T19:54:19.587 回答