【问题标题】:Update Item from Firebase从 Firebase 更新项目
【发布时间】:2014-12-05 02:28:53
【问题描述】:

我正在研究如何更新存储在我的 Firebase 中的项目。我已经设法让它达到我可以创建和删除项目的地步。我现在想编辑和更新现有项目。我的项目在页面上重复出现,每个项目旁边都有一个“编辑”按钮。

HTML

<form>
  <input type="text" placeholder="Enter title here" ng-model="editedProvider.title">
  <button type="submit" ng-click="updateProvider(provider.name)">Submit</button>
</form>

我正在将项目添加到我的列表中,如下所示:

JS

$scope.newProvider = {};
$scope.providers = [];

providersRef.on('child_added', function(snapshot) {
  $timeout(function() {
    var snapshotVal = snapshot.val();
    $scope.providers.push({
      title: snapshotVal.title,
      name: snapshot.name()
    });
  });
});

// Create Item
$scope.createProvider = function() {
  var newProvider = {
    title: $scope.title,
  };
  providersRef.push(newProvider);
};

我不知道如何更新此项目。我有一个如下所示的更新提供程序函数:

$scope.updateProvider = function(name) {
  providersRef.child(name).update({
    title: snapshotVal.title
  });
};

但这会在控制台中显示此错误:

错误:Firebase.child 失败:第一个参数是无效路径:“未定义”。路径必须是非空字符串,并且不能包含“.”、“#”、“$”、“[”或“]”

我尝试创建一个函数来查找使用 snapshot.name() 来检查它与我正在编辑的项目,以使用新值更新 title,但它似乎不起作用。

知道我做错了什么吗?

我已经设置了Plunker over here。感谢您对我做错的任何帮助。

【问题讨论】:

  • 当我在那个 plunker 中更新医院时,我在控制台中收到一条错误消息。请在您的问题中包含此错误消息,因为人们不应该去您的 plunker 获取它。

标签: javascript angularjs firebase


【解决方案1】:

您认为相关的 HTML 是这样的:

  <div ng-show="shouldShowEditing()">
    <h3>Editing {{ editedProvider.title }}</h3>
    <form role="form" name="addPlaceForm">
      <div class="form-group">
        <input type="text" placeholder="Enter title here" ng-model="editedProvider.title">
      </div>

      <div class="form-group">
        <button type="submit" class="btn btn-primary btn-lg" ng-click="updateProvider(provider.name)">Submit</button>
      </div>
    </form>
    <button type="button" class="btn btn-default" ng-click="cancelEditing();">Cancel</button>
  </div>

相关代码是这样的:

$scope.updateProvider = function(name) {
  console.log('updateProvider: '+name);
  providersRef.child(name).update({
    title: snapshotVal.title
  });
};

我添加了该 console.log 语句,因为它很容易向您显示出了什么问题。输出是:

updateProvider:未定义

因此,您可以看到您没有正确传递提供者的名称。有了这些知识,您可以返回 HTML 并看到您在其中引用了provider.name,该表单的其余部分引用了editedProvider。

所以解决方法是:

<button type="submit" class="btn btn-primary btn-lg" ng-click="updateProvider(editedProvider.name)">Submit</button>

更新

名称传递问题解决后,下一条错误消息是:

ReferenceError: snapshotVal 未定义

这也很清楚:您的 updateProvider 代码看起来是从 Firebase 侦听器之一复制/粘贴的,并且引用了一个不存在的 snapshotVal。相反,它应该从 Angular 范围内获取新标题:

$scope.updateProvider = function(name) {
  providersRef.child(name).update({
    title: $scope.editedProvider.title
  });
};

【讨论】:

  • 我已经进行了这些更正,但它似乎没有更新项目标题...我在这里遗漏了什么吗?另外,当您说使用控制台时,您是指 Chrome 的开发者工具中的控制台还是 Plunker 内置了自己的控制台?
  • 等等!我想我明白了。这行得通吗? providersRef.child(name).update({ title: $scope.editedProvider.title });这是更新项目的正确方法吗?
  • 您的 plunker 仍然包含我指出的错误。如果不解决这个问题,代码将永远无法工作。但它可能还有更多问题。尝试了您的最后一次更改,但它会更新提供者的标题。所以有两个错误。顺便说一句:如果您在updateProvider 中设置断点并使用调试器,则可以轻松找到并修复两者;
  • undefined 错误?如果是这样,我已经在上面更新了 plunker (plnkr.co/edit/APyuCO6k9Q7h4tCnFGdC?p=preview) 并进行了您的更正。这会在提交时更新项目的title。你觉得这对吗?另外,断点和调试器是什么意思?
  • 您需要学习如何调试 JavaScript 代码,这是让您自己摆脱此类问题的最佳方式。我建议你谷歌“现代 javascript 调试”或类似的东西来开始。
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多