【问题标题】:How to work with javascript object methods in Angularfire如何在 Angularfire 中使用 javascript 对象方法
【发布时间】:2013-10-16 08:33:29
【问题描述】:

我有一个代表餐厅订单的对象:

function order () {
  this.customer_name = ''
  this.menu = // menu object
  }

扩展了一些用于业务逻辑的对象方法,例如:

order.prototype.value = function() {
  var total = 0;
  for (var i = 0; i < this.menu.length; i++) {
    // calculate the order value
  }
  return total;
}

在 Angular 控制器中,订单在提交时会被推送到数组中(通过视图中按钮的 ng-click):

var ref = new Firebase('https://myfirebase.firebaseio.com');
$scope.orders = [];
angularFire(ref, $scope, 'orders');

$scope.currentOrder = orderService;

$scope.submitOrder = function() {
  $scope.orders.push($scope.currentOrder);
};

一旦将订单推送到数组中,orders[0].customer_name 之类的属性就会起作用,但orders[0].value() 之类的方法则不起作用。

Firebase/Angularfire 只会同步 JSON 似乎是合理的,但有没有一种方法可以让我将与订单相关的逻辑包含在 order 对象中,即无需编写 $scope.getOrderValue(orders[0])

【问题讨论】:

    标签: javascript angularjs firebase angularfire


    【解决方案1】:

    根据Firebase FAQ

    在底层,我们支持与 JSON 基本相同的数据类型:字符串、数字、布尔值和对象(它们又包含字符串、数字、布尔值和更多对象)。

    这意味着您可以存储数据但不能存储函数。完成同一件事的一种干净方法似乎是将最新的订单值存储为order 对象的属性,并在orderService 中添加一个方法,该方法在添加或删除菜单项时更新它.或者,按照您的建议执行并在某处使用getOrderValue,但将其放入服务中可能仍然有意义。

    【讨论】:

    • 如果你真的想按照你的建议去做,你可以使用 Function 构造函数(即 new Function(orders[0].value)())。只需确保您不信任的任何人都无法修改您对象的 value 属性(例如运行恶意函数)。
    • 是的,这很好,无论价值如何计算或显示,用户对订单价值的“版本”不应该是订单真实价值的最终权威,因为它可以被操纵客户端。
    【解决方案2】:

    其实我也有同样的问题。 我想向我的 firebase 对象添加一个方法。 在查看了最新的 angularfire 文档后,我发现 $extend 可以做到这一点 我还没有测试它,但我认为这是解决问题的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2016-09-10
      • 2012-06-10
      相关资源
      最近更新 更多