2016-04-18 5 views
0

以下のコードは、いくつかのバイト数を読み込み可能な形式に変換する関数を定義する標準のJavaScriptパターンを示しています。Ember.js - アクションに値を返すことができるグローバル関数を定義します。

標準のJavaScriptでは、関数を変数として呼び出すことができます。そのため、変数の値は、関数が返すものであれば何でも構いません。

//Define function 
 
function bytesToReadable(numberOfBytes) { 
 
    var readableSize; 
 
    var units; 
 
    if (numberOfBytes <= 1000) { 
 
    readableSize = numberOfBytes; 
 
    units = ' bytes'; 
 
    } else if (numberOfBytes > 1000 && numberOfBytes <= 1000000) { 
 
    readableSize = Math.ceil(numberOfBytes/1000); 
 
    units = ' KB'; 
 
    } else if (numberOfBytes > 1000000 && numberOfBytes <= 1000000000) { 
 
    readableSize = (numberOfBytes/1000000).toFixed(2); 
 
    units = ' MB'; 
 
    } else if (numberOfBytes > 1000000000 && numberOfBytes <= 1000000000000) { 
 
    readableSize = Math.ceil(numberOfBytes/1000000000); 
 
    units = ' GB'; 
 
    } 
 
    var prettySize = readableSize + units; 
 
    return prettySize; 
 
} 
 
//Call function 
 
var test = bytesToReadable(2360000); 
 
console.log(test);//Logs '2.36MB'

エンバーにおけるこの種のパターンを達成するための正しい方法は何ですか?

は、私は以下のようにそれ自身の行動のコードを配置しようとしているが、これはundefinedを返します:

bytesToReadable: function(numberOfBytes) { 
 
    var readableSize; 
 
    var units; 
 
    if (numberOfBytes <= 1000) { 
 
     readableSize = numberOfBytes; 
 
     units = ' bytes'; 
 
    } else if (numberOfBytes > 1000 && numberOfBytes <= 1000000) { 
 
     readableSize = Math.ceil(numberOfBytes/1000); 
 
     units = ' KB'; 
 
    } else if (numberOfBytes > 1000000 && numberOfBytes <= 1000000000) { 
 
     readableSize = (numberOfBytes/1000000).toFixed(2); 
 
     units = ' MB'; 
 
    } else if (numberOfBytes > 1000000000 && numberOfBytes <= 1000000000000) { 
 
     readableSize = Math.ceil(numberOfBytes/1000000000); 
 
     units = ' GB'; 
 
    } 
 
    var prettySize = readableSize + units; 
 
    return prettySize; 
 
    }, 
 
    actions: { 
 
    anotherAction: function() { 
 
     var test = this.get('bytesToReadable', 2360000); 
 
     console.log(test);//Logs the function itself. 
 
    }, 
 
    }

actions: { 
 
    bytesToReadable: function(numberOfBytes) { 
 
    var readableSize; 
 
    var units; 
 
    if (numberOfBytes <= 1000) { 
 
     readableSize = numberOfBytes; 
 
     units = ' bytes'; 
 
    } else if (numberOfBytes > 1000 && numberOfBytes <= 1000000) { 
 
     readableSize = Math.ceil(numberOfBytes/1000); 
 
     units = ' KB'; 
 
    } else if (numberOfBytes > 1000000 && numberOfBytes <= 1000000000) { 
 
     readableSize = (numberOfBytes/1000000).toFixed(2); 
 
     units = ' MB'; 
 
    } else if (numberOfBytes > 1000000000 && numberOfBytes <= 1000000000000) { 
 
     readableSize = Math.ceil(numberOfBytes/1000000000); 
 
     units = ' GB'; 
 
    } 
 
    var prettySize = readableSize + units; 
 
    return prettySize; 
 
    }, 
 

 
    anotherAction: function() { 
 
    var test = this.send('bytesToReadable', 2360000); 
 
    console.log(test) //Logs undefined. 
 
    }, 
 
}


は私もプロパティを使用して試してみました

私のアプリケーションのさまざまな部分からこのコードを実行したいと考えています。私のアプリ全体でこのような関数を利用できるようにする最良の方法は何ですか?その結果、呼び出された関数に結果を返すことができますか?

答えて

0

これに対処する適切な方法はember g util bytesToReadableが定型を生成します実行し、ユーティリティ関数を作成することです、どんな残っていると、ファイルにコードを移動することです:

export default function bytesToReadable(numberOfBytes) { 
    let readableSize; 
    let units; 
    if (numberOfBytes <= 1000) { 
    readableSize = numberOfBytes; 
    units = ' bytes'; 
    } else if (numberOfBytes > 1000 && numberOfBytes <= 1000000) { 
    readableSize = Math.ceil(numberOfBytes/1000); 
    units = ' KB'; 
    } else if (numberOfBytes > 1000000 && numberOfBytes <= 1000000000) { 
    readableSize = (numberOfBytes/1000000).toFixed(2); 
    units = ' MB'; 
    } else if (numberOfBytes > 1000000000 && numberOfBytes <= 1000000000000) { 
    readableSize = Math.ceil(numberOfBytes/1000000000); 
    units = ' GB'; 
    } 
    let prettySize = readableSize + units; 
    return prettySize; 
} 

そして、あなたがしたいですあなたはimport bytesToReadable from 'yourAppName/utils/bytes-to-readable'となるアプリで使ってください。

+1

傍注上、これはプレゼンテーション上の懸念のようですが、ヘルパーがそれに適している可能性があります。 –

+1

また、 'bytes'はコンポーネントプロパティとして扱われ、' bytesToReadable'はあなたのユーティリティ関数を使った計算されたプロパティでなければなりません。プレゼンテーションの問題でない限り。これらの場合、@Kitlerとしてテンプレートヘルパーを使用する必要があります。 – jelhan

+0

すばらしい答えをありがとう。私は上記を試して、 'var test = bytesToReadable(2360000);で完璧に動作しました - 変数' test'は '2.36MB'です。 しかし、これは単なるプレゼンテーションの問題ですから、あなたのアドバイスを受け取り、これをコンポーネントとして実装しました。アドバイスをありがとう:)。 – AJP

関連する問題