【问题标题】:How to delete angularfire object after calling $bindTo调用 $bindTo 后如何删除 angularfire 对象
【发布时间】:2015-04-29 02:20:00
【问题描述】:

在对象上调用 angularfire 的 $bindTo() 后如何从 firebase 中删除对象。出于某种原因,调用 $bindTo() 似乎会从对象中删除 $remove() 函数。

例如,除非您注释掉 $bindTo 行,否则以下应用中的删除按钮不起作用。

Codepen

JS

var app = angular.module('myApp', ['firebase']);

app.controller('myCtrl', MyCtrl);

function MyCtrl($scope, $firebaseObject) {
  var self = this;
  this.test = $firebaseObject(new Firebase('https://bindtoissue.firebaseio-demo.com/test'));

  //if you comment out this line then the delete button will work.
  this.test.$bindTo($scope, 'ctrl.test');

  this.test.$loaded(function() {
    self.test.one = 1;
    self.test.two = 2;
    self.test.three = 3;
  });
}

MyCtrl.prototype.delete = function() {
  //$remove is undefined
  this.test.$remove();
}

HTML

<div ng-app="myApp" ng-controller="myCtrl as ctrl">
    <button ng-click="ctrl.delete()">delete</button>
    <pre>{{ctrl.test | json}}</pre>
</div>

【问题讨论】:

  • 试试this.test.ref().remove()
  • ref 也未定义
  • 是的,通过我已经想知道的代码。您绝对可以重建 ref 并在其上调用 remove(),但感觉应该有一种更简单的方法。我看看能不能挖点东西。感谢使用&lt;pre&gt;{{ctrl.test | json}}&lt;/pre&gt; 方法来记录值​​顺便说一句,我们正在努力推广这一点。 :-)
  • 是的,我找到了一些解决方法,例如重建 ref,但只是想知道最好的方法是什么。感谢您的调查

标签: javascript angularjs firebase angularfire


【解决方案1】:

请注意,$bindTo() 不会将同步对象放在作用域上,而只是将数据放在作用域上。在这种情况下,您将同步的 $firebaseObject 放在this.test,然后还将数据绑定到this.test

请注意,在此示例中,没有理由使用 $bindTo()。您可以在不创建 3 向绑定的情况下调用 $remove(),这仅在您不想手动调用 $save() 时对对象进行本地更改有用。

另外,这里 $loaded 的用法不正确。当你使用 $bindTo() 时,你会想要使用它返回的 promise。

this.test.$bindTo($scope, 'ctrl.test')
  .then(function() {
    self.test.one = 1;
    self.test.two = 2;
    self.test.three = 3;
  });

【讨论】:

  • so...如何在调用 $bindTo 后删除 angularfire 对象?我只需要创建两个 $firebaseObjects 并在一个上调用 $bindTo 并在另一个上调用 $remove 吗?有什么方法可以调用 $bindTo 而不会替换你调用它的对象?
  • 刚刚尝试过类似this.test.$bindTo($scope, 'ctrl.test2'); 的方法,这似乎有效。有了这个,我可以绑定到视图中的ctrl.test2 并在控制器中调用$remove 上的this.test。这并不理想,但它是迄今为止我发现的最好的解决方法
  • 我看不出这是一种解决方法。如果您使用 POJO 覆盖您的 $firebaseObject 引用,那么它不再存在并且您不能调用 $remove。不覆盖它在这里几乎不是一种解决方法。并且为了冗余,您在这里所做的任何事情都不需要 $bindTo 引用。您可以在视图中直接使用 $firebaseObject 引用。
  • 这是一个关于$bindTo行为的问题,所以它需要使用$bindTo。我可以在示例中添加一个输入框,但这并不会真正改变我的问题。有点奇怪的是,当您使用 $bindTo 时,您需要保留对相同数据的两个引用。一个在可以更新服务器的范围上,一个具有 $firebaseObject 方法,如 $remove。
  • $bindTo 便于将 $firebaseObject 的数据绑定到范围。它既不是必需的,也不是 $firebaseObject 本身。尝试在同步的原型对象上 $watch 会有点精神分裂。如果您想要一个对象,请将 $firebaseObject 绑定到范围。进行更改时调用 $save()。并跳过 $bindTo。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
相关资源
最近更新 更多