【问题标题】:Uncaught TypeError: Cannot call method 'push' of undefined未捕获的类型错误:无法调用未定义的方法“推送”
【发布时间】:2013-04-29 16:33:47
【问题描述】:

我尝试让 firebase 绑定与 knockoutjs 一起使用,但无法让它们正常工作,因此我正在尝试使用 angularjs 进行一些测试。所以我下载了 angularjs,我试图输入/输出一些数据。所以现在我的 app.js 中有这个:

/* Controllers */

angular.module('MyCtrl3', ['$scope', 'angularFire'])
.controller ("MyCtrl3", function ($scope, angularFire) {
$scope.addMsg = function ($scope, angularFire) {
    var url = 'https://kingpinapp.firebaseio.com/msgs';
    var promise = angularFire(url, $scope, 'msgs', []);
    $scope.msgs.push({name: "Firebase", desc: "is awesome!"});

}
});

然后我的html就是:

<!doctype html>
<html lang="en" ng-app>
<head>
<meta charset="utf-8">
<title>My AngularJS App</title>
<link rel="stylesheet" href="css/app.css"/>
<link rel="stylesheet" href="css/bootstrap.css"/>
</head>
<body>

<div>Angular seed app: v<span app-version></span></div>

<div ng-controller="MyCtrl3">

<button ng-click="addMsg()">Add</button>
</div>

<!-- bunch of scripts -->
</body>
</html>

只是试图让添加按钮推送到 Firebase。我在控制台中收到此错误:Uncaught TypeError: Cannot call method 'push' of undefined。 添加了一个jsfiddle:http://jsfiddle.net/NHaZz/5/

【问题讨论】:

  • 你能用它制作一个小提琴吗?
  • 我对 Angular 不是很熟悉,但您确定您的 URL 正在返回有效数据吗?如果服务器的返回为空或以某种方式意外,也许 $scope.msgs 没有被正确初始化?我会在你的 promise 回调中抛出一个控制台日志,看看返回 promise 时 '$scope' 和 '$scope.msgs' 的样子。要么,要么您需要手动/显式初始化 $scope.msgs (我不知道 Angular 或您使用的任何插件是否应该自己处理)
  • 从外观上看,您没有将 $scope.msgs 初始化为控制器中的空数组。在 MyCtrl3 的开头尝试一下。
  • 更新了代码以简化问题。还上传了一个jsfiddle。
  • 你能试试@JBland 和我上面建议的一些事情并反馈吗?

标签: javascript angularjs firebase


【解决方案1】:

AngularFire 返回一个promise,因此在promise 完成之前你不能操作数组。您可以使用then 函数执行此操作,如下所示:

angular.module('MyCtrl3', ['$scope', 'angularFire'])
.controller ("MyCtrl3", function ($scope, angularFire) {
  var url = 'https://kingpinapp.firebaseio.com/msgs';
  var promise = angularFire(url, $scope, 'msgs', []);
  promise.then(function() {
    $scope.addMsg = function ($scope, angularFire) {
      $scope.msgs.push({name: "Firebase", desc: "is awesome!"});
    }
  });
});

【讨论】:

  • 仍然有这些:错误:参数'MyCtrl3'不是函数,未定义未捕获类型错误:无法调用未定义的方法'push'
  • 您的模块和控制器具有相同的名称(将 angular.module 的第一个参数更改为其他名称,并在 HTML 中将 ng-app 设置为该名称)。
  • 嗯,越来越近了。在将模块更新为不同的名称并将其添加到 html 之后。我得到:未捕获的错误:没有模块:$scope。而且这个仍然存在:未捕获的类型错误:无法调用未定义的方法'push'
  • 您还没有将 Firebase 定义为您的模块的依赖项。这是一个有效的小提琴:jsfiddle.net/DR4r9/10
【解决方案2】:

AngularFire 0.3.0 好像变了一点,所以不能只用angularFire发送一个url,需要提供:

new Firebase("example-url-to-your-firebase.com");

像这样:http://jsfiddle.net/DR4r9/14/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 2011-11-12
    • 2013-09-14
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多