当前位置: 首页 > 知识库问答 >
问题:

AngularFire:如何通过一个属性访问一个项目?

茹轩昂
2023-03-14

我的Firebase数据是这样组织的:

+ myappname
  + customers
    + -JV2NQv3GmoM81zdUfTe
      + name: "Mary"
      + age: "24"
      + ...
    + -JV2N9NnItCfz5vB04RS
      + name: "John"
      + age: "32"
      + ...
    + ...
  + ...

如何通过名称检索客户?
名称保证是唯一的。
这是我的客户服务,目前:

app.factory('Customer', function ($firebase, FIREBASE_URL) {
  var ref = new Firebase(FIREBASE_URL + 'customers');
  var customers = $firebase(ref);

  var Customer = {
    all: customers,
    create: function (customer) {
      return customers.$add(customer).then(function (ref) {
        var customerId = ref.name();
        return customerId;
      });
    },
    set: function(customerId, customer) {
      return customers.$child(customerId).$set(customer);
    },
    find: function (customerId) {
      return customers.$child(customerId);
    },
    findByName: function (customerName) { // TODO...
    },
    delete: function (customerId) {
      var customer = Customer.find(customerId);
      customer.deleted = true;
      customer.$on('loaded', function () {
        customers.$child(customerId).$set(customer);
      });
    }
  };
  return Customer;
});

我应该在每个findByName()调用中扫描所有客户吗?
还是应该构建一个类似“二级索引”的东西?
拜托,一些建议,我才刚刚开始...-(

共有1个答案

龚德本
2023-03-14

由于Kato的指示和Frank van Puffelen的建议,我终于解决了自己的问题。
我确实在我的Firebase中添加了一个“索引”,“customersbyname”(记住“磁盘空间很便宜,用户的时间不是”Firebase的座右铭...:-)。
我没有遵循参考答案中的方向,因为我认为这个解决方案更通用:它可以扩展多个“索引”...
我想把它贴在这里,希望对其他人有用。
我想看看评论:这个解决方案可能有缺点吗?总的来说,对于某些用例来说,这是一个明智的解决方案吗?

app.factory('Customer', function ($firebase, FIREBASE_URL) {
  var ref = new Firebase(FIREBASE_URL + 'customers');
  var customers = $firebase(ref);
  var refByName = new Firebase(FIREBASE_URL + 'customersByName');
  var customersByName = $firebase(refByName);

  var Customer = {
    all: customers,
    create: function (customer) {
      return customers.$add(customer).then(function (ref) {
        var customerId = ref.name();
        customersByName.$child(customer.name).$set(customerId);
        return customerId;
      });
    },
    set: function(customerId, customer) {
      var oldname = customers.$child(customerId).name;
      if (customer.name !== oldname) {
        customersByName.$remove(oldname);
      }
      customersByName.$child(customer.name).$set(customerId);
      return customers.$child(customerId).$set(customer);
    },
    find: function (customerId) {
      return customers.$child(customerId);
    },
    findByName: function (customerName) {
      return customersByName.$child(customerName);
    },
    delete: function (customerId) {
      var customer = Customer.find(customerId);
      customer.deleted = true;
      customer.$on('loaded', function () {
        customersByName.$remove(customer.name);
        customers.$child(customerId).$set(customer);
      });
    }
  };

  return Customer;
});
 类似资料:
  • 谁能帮帮我吗。我有一个物品清单——在我的例子中有啤酒厂。每个酿酒厂都有一些属性(字段),如姓名、地址、id、省份(所在州)等。。。一家酿酒厂(名称)可以位于多个省份。现在我需要解决的问题是:如何计算每个州的啤酒厂数量?所以,按省份分组。所有数据都是从csv文件读取的。我已经创建了返回啤酒厂列表的阅读器。当我尝试这个: 这将返回我键(省)和整个对象作为值。 我已经坐了几个小时了。我没有主意了。

  • 问题内容: 因此,我最近开始涉足OOP,到目前为止一切进展顺利。虽然我本身没有任何问题,但我希望有一个令人惊奇的功能,尽管我找不到关于该功能的任何文档。 在为对象分配属性时,我经常发现我必须更改依赖于他人的属性,例如光明与黑暗。这是一个例子: 现在,尽管这很酷,但我想要的是相同的过程,但是如果一个属性发生更改,则在同一对象内。如果我重置光的属性(是的),我希望黑暗相应地增加/减少。如果可以更改光的

  • 问题内容: 是否有一种优雅的方式来访问对象的第一个属性… 您不知道物业名称的地方 而不使用像jQuery这样的循环 例如,我需要在不知道foo1名称的情况下访问对象: 问题答案: var obj = { first: ‘someVal’ }; obj[Object.keys(obj)[0]]; //returns ‘someVal’ 使用此方法,您还可以通过索引访问其他属性。请注意!根据ECMAS

  • 问题内容: 考虑以下简化数据: 还有一个车把模板: 这是行不通的,因为在循环中,父作用域是不可访问的-至少不能以我尝试过的任何方式。我希望有办法做到这一点! 问题答案: 有两种有效的方法可以实现此目的。 取消引用父范围 通过在属性名称前添加前缀,可以引用父作用域。 您可以通过重复来提高多个级别。例如,要上两个级别,请使用。 取消引用根范围 通过添加到属性路径,您可以从最高范围向下导航(如cabal

  • 问题内容: 是否可以通过读取另一个bean的属性来设置一个bean的属性?例如,假设我有: 我希望Spring实例化这两个类,并调用A的setList方法,并传入调用B的getList方法的结果。Spring配置可能类似于: las,这种伪造的XML不起作用。 为什么不将B注入A?因为我不想引入额外的依赖关系。A仅依赖列表,而不依赖B。 问题答案: 如果你使用的是spring 3.0,还可以使用新

  • 问题内容: 是否可以通过读取另一个bean的属性来设置一个bean的属性?例如,假设我有: 我希望Spring实例化这两个类,并调用A的setList方法,并传入调用B的getList方法的结果。Spring配置可能类似于: las,这种伪造的XML不起作用。 为什么不将B注入A?因为我不想引入额外的依赖关系。A仅依赖列表,而不依赖B。 问题答案: 除了@Kevin的答案,如果您使用的是sprin