2017-06-16 8 views
0

Aurelia oneTimeバインディングがこのように動作している理由を知りたい。 私はこのようなHTMLを持っています。Aurelia oneTime bindingビヘイビア

<span> ${dbaName & oneTime}</span> 
<input type="text" value.bind="dbaName" spellcheck="false" /> 

マイビューモデルはtypescriptですで、このようなもので、AJAX呼び出しの成功の後、私はdbaNameに値を代入しています:

export class VendorGeneral 
{ 
     dbaName:string; 
     constructor() 
     { 
     } 

     activate() 
     { 
     $.ajax({ 
      url: "servicecall", 
      context: document.body 
     }).done(function() { 
      this.dbaName = "DATA ADMIN"; 
     }); 
     } 
} 

今、HTMLとして出力を表示します何:

<span> ${dbaName & oneTime}</span> **blank** 
<input type="text" value.bind="dbaName" spellcheck="false" /> **DATA ADMIN** 

スパンでは、空白の値または空の文字列を取得しますが、テキストボックスでは正しい値としてデータ管理者を取得します。

なぜ私に教えてくださいワンタイムバインドは空の文字列を与えて、これを修正する方法は?

答えて

3

名前が示すように、oneTimeは一度だけバインドされ、その後の変更はすべて無視されます。ビューがレンダリングされるとき、dbaNameの値はundefinedです。したがって、スパンのコンテンツはundefinedになります。これは「なし」と等しくなります。

あなたはactivateを使用していますが、間違った方法で使用しています。 ajax呼び出しの戻り後にビューをレンダリングする場合は、activateメソッドで約束を返さなければなりません。何かのように:私はあなたがaurelia-fetch-client代わりの$.ajaxを使用することをお勧めします

activate { 
    return yourPromise() 
    .then(() => this.dbaName = 'admin'); 
} 

$.ajaxをまだ使用したい場合は、試してみてください(テストされていないコード):

activate() { 
    return $.ajax({ 
    url: "servicecall", 
    context: document.body 
    }).then(() => { 
    this.dbaName = "DATA ADMIN"; 
    }); 
}