Ember.js-定义一个可以为操作返回值的全局函数

时间:2016-04-18 11:08:38

标签: javascript ember.js

下面的代码显示了一个标准的JavaScript模式,用于定义一个占用大量字节并将其转换为可读格式的函数。

在标准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'

在Ember中实现这种模式的正确方法是什么?

我已经尝试将代码放在它自己的操作中,如下所示,但这会返回undefined:

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.
  },
}
我也尝试过使用属性:

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.
    },
  }

我希望能够从我的应用程序的各个不同部分运行此代码。在我的应用程序中使这样的函数可用的最佳方法是什么,以便它可以将结果返回到它从中调用的函数?

1 个答案:

答案 0 :(得分: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'