2016-04-06 14 views
1

Emberアプリケーションを開発して、入力フィールドでユーザー入力を受け取り、それをアメリカの通貨でフォーマットし、ユーザーにフォーマットされた値を表示します。ember入力フィールドをプログラムで更新する方法

テンプレートである:

<script type="text/x-handlebars" id="index"> 
    {{input value=savings id="userSavings"}} 
    <p>Formatted Savings={{formattedSavings}}</p> 
</script> 

コントローラである:

App.IndexController = Ember.Controller.extend({ 
savings:null, 

formattedSavings:function(){ 
    return formatMoney(this.get('savings')); 
}.property('savings'), 

onSavingsChange:function(){ 
    newValue=formatMoney(this.savings); 
    console.log("formatted value="+newValue); 

    //this.savings=newValue; 
    //$("#userSavings").val(newValue); 
}.observes('savings'), 

})

formatMoney関数である:

function formatMoney(inputNumber) 
{ 
try { 
     inputNumber = Math.round(inputNumber); 
     var n = inputNumber.toString().split("."); 
     n[0] = n[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); 
     return "$" + n.join("."); 
    } 
    catch(e) { 
     console.error("Error="+e); 
    } 
} 

ユーザーが数字を入力した後、入力フィールドの値をアメリカの通貨形式にしておきます。しかし、それは起こっていない。 入力フィールドの値は、変数節約indexControllerにバインドされています。フォーマットされた値newValueが得られたら、これを入力フィールドに反映したいと思います。

私は道this.savings = newValueにとjQueryウェイ$( "#のuserSavings")のval(newValueに)両方エンバーを試してみました。でも動作しません。 formattedSavingsの出力を見ることができますが、入力フィールドには反映されません。

に実装すると、jQueryのみ(スタンドアロンのjQueryアプリケーション)で動作します。しかし、Emberが絵になると、動作しません。

この問題を解決するにはどうすればよいですか?

+0

どのようなバージョンですか? – miguelcobain

+0

Ember 1.6.1とjQuery 1.11を使用しています。何らかの理由でEmberの新しいバージョンにアップグレードできません。 –

+0

あなたは 'this.set( 'savings'、newValue)'を実行できます。なぜそんなに複雑になるのか。オブザーバーではなく、CPを使用して、set()でフォーマットを行います。 – Lux

答えて

0

ソリューションは、あなたのIndexControllerformatMoney関数を宣言し、作業のデモをここでフォーマット機能に

コントローラ

App.IndexController = Ember.Controller.extend({ 
savings:0, 

formatMoney:function(inputNumber){ 


    try { 

     var n = inputNumber 
     .replace(/\D/g,'') 
     .toString() 
     .split("."); 

     n[0] = n[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); 
     return n.join("."); 
    } 
    catch(e) { 
     console.error("Error="+e); 
    } 
}, 

    actions:{ 

    format:function(){ 

      //Getting the formatted value 
     var formattedSavings = this.formatMoney(this.get('savings')); 

     //Setting the formated value back to savings 
     this.set('savings', formattedSavings); 


    } 
    } 


}); 

をトリガの入力にactionを追加することができhttp://emberjs.jsbin.com/zeruyu/edit?html,js,console,output

+0

入力フィールドに "Format Savings ="と表示されている値を表示したいとします。入力欄に書式を適用したい。たとえば、入力フィールドに34,345ドル –

+0

私は既に私の答えとデモを更新しました –

1

ここで最初に重要なことは、なぜ動作していないのか、あなたのemberバージョンの制限事項を理解することです。

Emberは同じrunloopでテンプレートを更新しません!

だから、あなたがしなければならない唯一のことは、更新の隣に実行ループの値です!

あり、これを行うには多くの方法がありますが、おそらく最も簡単にはEmber.run.nextを使用することです:

_savings: '', 
savings: Ember.computed('_savings', function(key, val) { 
    var self = this; 
    if(arguments.length === 2) { 
     Ember.run.next(function() { 
      self.set('_savings', formatMoney(val)); 
     }); 
    } 
    return Ember.get(this, '_savings'); 
}) 

あなたは次の実行ループで更新しているため常に動作しますが、他のコードを見つけることができます。