Ember.js-定义一个全局函数,该函数可以向操作返回值

Ember.js- define a global function that can return a value to actions

本文关键字:函数 可以向 返回值 操作 全局 一个 定义 js- Ember      更新时间:2023-09-26

下面的代码显示了一个标准的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中实现这种模式的正确方法是什么?

我试着把代码放在它自己的操作中,如下所示,但这返回了未定义的:


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

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

处理此问题的正确方法是创建一个实用程序函数,运行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'