AngularJS错误:TypeError:v2.login不是函数

时间:2015-08-14 06:18:05

标签: angularjs firebase angularjs-ng-click firebase-authentication

我想在单击登录按钮时调用登录功能,但不断收到标题中的错误消息。有人可以在我的脚本中指出错误吗?

下面的login.js代码:



/*global Firebase, angular, console*/

'use strict';
// Create a new app with the AngularFire module
var app = angular.module("runsheetApp");

app.controller("AuthCtrl", function ($scope, $firebaseAuth) {
    var ref = new Firebase("https://xxxxx.firebaseio.com");
    function login() {
        ref.authWithPassword({
            email    : "xxxxx",
            password : "xxxx"
        }, function (error, authData) {
            if (error) {
                console.log("Login Failed!", error);
            } else {
                console.log("Authenticated successfully with payload:", authData);
            }
        });
    }
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js"></script>
&#13;
&#13;
&#13;

login.html的代码也在下面:

&#13;
&#13;
<div class="container" style="max-width: 300px">
    <form class="form-signin">       
      <h2 class="form-signin-heading" style="text-align: center">Please Sign In</h2>
      <input type="text" class="form-control" name="username" ng-model = "username" placeholder="Email Address" required="" autofocus="" />
        </br>
      <input type="password" class="form-control" name="password" ng-model = "password" placeholder="Password" required=""/>
        </br>
      <button class="btn btn-lg btn-primary btn-block" type="submit" ng-click="login()">Login</button>   
    </form>
  </div>
&#13;
&#13;
&#13;

8 个答案:

答案 0 :(得分:65)

边缘案例,但我想提到后人的缘故。使用带有name形式的controllerAs模式时,我遇到同样的错误,其值与ng-submit相同。例如:

<form name="authCtrl.signUp" ng-submit="authCtrl.signUp()">

抛出: TypeError:v2.signUp不是函数

解决方案是将表单的名称更改为不同的名称:

<form name="authCtrl.signUpForm" ng-submit="authCtrl.signUp()">

答案 1 :(得分:11)

在AngularJS中,从视图中调用函数,它必须在$ scope中。

<强> JS

// exposes login function in scope
$scope.login = login;

<强> HTML

<div class="container" ng-controller="AuthCtrl" style="max-width: 300px"> <!-- I notice here for include ng-controller to your main div -->
<form class="form-signin">       
  <h2 class="form-signin-heading" style="text-align: center">Please Sign In</h2>
  <input type="text" class="form-control" name="username" ng-model = "username" placeholder="Email Address" required="" autofocus="" />
    </br>
  <input type="password" class="form-control" name="password" ng-model = "password" placeholder="Password" required=""/>
    </br>
  <button class="btn btn-lg btn-primary btn-block" type="submit" ng-click="login()">Login</button>   
</form>

答案 2 :(得分:11)

就我而言,我和你的问题完全相同。然而,遇到gkalpak's answer这样的情景帮助了我。

原来我正在调用的是addBuddy()函数,来自名为“addBuddy”的表单。解决方案是改变两个东西中的任何一个的名称,使其脱颖而出或与另一个区别开来。我将表单的名称更改为“addBuddyForm”,瞧!我的功能奏效了!

以下是我的案例片段:

<form name="addBuddy" class="form-horizontal" novalidate>
...
<button class="btn btn-sm btn-info" ng-click="addBuddy()>Submit</button>

其中,我改为:

<form name="addBuddyForm" class="form-horizontal" novalidate>
...
<button class="btn btn-sm btn-info" ng-click="addBuddy()>Submit</button>

......它有效! :)

答案 3 :(得分:7)

这可能不是您的问题所特有的,但我也遇到了这个错误,并且需要花点时间来弄清楚原因。

我已经将函数和变量命名为相同,并且在函数中指定了变量,因此变量的赋值覆盖了函数,并且在第二次运行时爆炸。

你会在示例中注意到uploadFile()函数是upload.uploadFile = true;这是一个很棒的文件,意思是upload.uploadingFile - 一个用于控制微调器行为的标志。一旦修复,问题就消失了。

示例:

(function()
{
  'use strict';

  angular.module('aumApp.file-upload')
  .controller('FileUploadCtrl', FileUploadCtrl);

  function FileUploadCtrl($scope, $http)
  {
    upload.uploadFile = function()
    {
      upload.uploadFile = true;
      var backendUrl = '/ua_aumcore/events/api/v1/events/uploadFile';
      var fd = new FormData();
      fd.append('file', upload.src);
      $http({ url: backendUrl, data: fd, method: 'POST', transformRequest : angular.identity, headers: { 'Content-Type' : undefined } })
      .then(function uploadSuccess(response)
      {
        upload.data = response.data;
        upload.message = "Uploaded Succesfully.";
        upload.uploadSuccess = true;
        upload.uploadingFile = false;
      },
      function uploadFailure(response)
      {
        upload.message = "Upload Failed.";
        upload.uploadSuccess = false;
        upload.uploadingFile = false;
      });
    };
  }
  FileUploadCtrl.$inject = ['$scope', '$http'];
})();

答案 4 :(得分:5)

要从视图中调用,函数必须位于$ scope中。添加

$scope.login = login;

到控制器的JS代码。

您还需要实际使用该控制器。变化

<div class="container" style="max-width: 300px">

<div ng-controller="AuthCtrl" class="container" style="max-width: 300px">

这是所有基本的东西。我的建议是在进一步学习之前先学习AngularJS教程。

答案 5 :(得分:4)

两个启用双向绑定您必须将登录功能分配给$ scope。用以下代码替换函数代码:

$scope.login=function() {
        ref.authWithPassword({
            email    : "nick.koulias@gmail.com",
            password : "Jaeger01"
        }, function (error, authData) {
            if (error) {
                console.log("Login Failed!", error);
            } else {
                console.log("Authenticated successfully with payload:", authData);
            }
        });
    }

答案 6 :(得分:3)

这可能是我迟到的答案。 但它为我工作

检查您设置的表单名称 的 e.g。 NG型=&#34;登录&#34;

和功能名称 的 e.g。纳克单击=&#34;登录()&#34;

然后它将无法正常工作。你必须改变其中一个。 的 e.g。 NG型=&#34;登录表单&#34;

答案 7 :(得分:0)

说明:

AngularJS 1.x通过formname中注册任何具有$scope属性的formDirectiveFactory DOM元素。如果以上情况成立,则此伪指令自动实例化form.FormController

  

如果指定了name属性,则表单控制器将发布到当前作用域下,

来自:angular.js:24855

因此,如果您有<form name=myForm>,它将覆盖您的$scope.myForm = function() { ... }