未捕获的TypeError:无法调用未定义的方法'push'

时间:2013-04-29 16:33:47

标签: javascript angularjs firebase

我尝试让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。我在控制台中收到此错误:未捕获TypeError:无法调用未定义的方法'push'。 添加了一个jsfiddle:http://jsfiddle.net/NHaZz/5/

2 个答案:

答案 0 :(得分:3)

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!"});
    }
  });
});

答案 1 :(得分:2)

AngularFire 0.3.0似乎已经改变了一点,所以你不能只使用angularFire发送一个url,你需要提供:

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

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