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" />

が変更されているかどうかを確認し、ContactEmail変更されている場合は、新しく選択した連絡先から電子メールと電話をロードするために、計算されたオブザーバブルが 1 つまたは 2 つ必要なようです。しかし、以前に選択した ID を保存するために を取得しようとして、現在の連絡先 ID が以前の ID と異なるかどうかを確認してから、現在の連絡先の電子メールを表示しようとしています。これらの関数はどのように見えるでしょうか?ContactPhoneSelectedContactIdSelectedHomeownerIdContactEmail

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 に答える