メニューから連絡先を変更するときに、いくつかの連絡先フィールドを条件付きで更新しようとしていますが、うまくいきません。私はいくつかのアプローチを試しましたが、どれもコード例を示すのに十分ではありません。
これが私のビジネスルールです:
初期化:
- 連絡先のリストを読み込みます。各連絡先には、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" />
が変更されているかどうかを確認し、ContactEmail
変更されている場合は、新しく選択した連絡先から電子メールと電話をロードするために、計算されたオブザーバブルが 1 つまたは 2 つ必要なようです。しかし、以前に選択した ID を保存するために を取得しようとして、現在の連絡先 ID が以前の ID と異なるかどうかを確認してから、現在の連絡先の電子メールを表示しようとしています。これらの関数はどのように見えるでしょうか?ContactPhone
SelectedContactId
SelectedHomeownerId
ContactEmail