简体   繁体   English

ANGULARJS / JAVASCRIPT:错误-未捕获的ReferenceError:函数未定义

[英]ANGULARJS/JAVASCRIPT : error - Uncaught ReferenceError: function is not defined

I am new to angularjs and javascript . 我是angularjs和javascript的新手。 I am building a 'blog' using the above two technologies. 我正在使用以上两种技术构建“博客”。 My html view code- 我的html查看代码-

<div ng-controller="Controller1">
<form  ng-submit="sub()" role="form">
Title: <textarea >

</textarea><br>
Body:
<textarea rows="10" cols="50">

</textarea><br>
Author:
<textarea>

</textarea><br>

 <button type="submit" onclick='sub()' >Submit</button>

</form>

but the problem is when I click on the "SUBMIT" button , it shows the above error in the console ie- Uncaught ReferenceError: sub is not defined 但是问题是当我单击“ SUBMIT”按钮时,它在控制台中显示了上述错误 ,即-Uncaught ReferenceError:sub未定义

my controller code- 我的控制器代码-

(function () {
    'use strict';

    angular
        .module('portal')
        .controller('Controller1', Controller1);

    Controller1.$inject = [ '$rootScope'];
    function Controller1($rootScope,$location) {

     var blog= { "article":
            [
        {
        "title": "Blog Post One",
        "body": [
          "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorem deleniti quae, neque libero voluptate maiores ullam unde voluptatem assumenda velit dolores impedit quis qui! Neque, cupiditate labore nulla? Atque, tenetur.",
          "Numquam nobis nam voluptas blanditiis eveniet in quasi possimus voluptatem temporibus doloremque delectus dolorum, voluptatum laborum aut dolorem? In rerum necessitatibus soluta incidunt nihil numquam fugit quas pariatur dolores nesciunt?",
          "Quibusdam placeat quisquam iure repellendus ad in, nihil numquam quaerat, facere alias illo. Tempora perferendis incidunt, ratione eveniet esse earum, corporis sit? Modi enim commodi odio placeat minus, error id?",
          "Corrupti voluptates asperiores ratione laudantium, eveniet molestiae possimus deleniti officia, incidunt quae et. Amet, ducimus eum ipsa reprehenderit ad, et nihil, veritatis ea doloremque ab placeat dolore impedit, quia eius."
        ],
        "author": "Nick Moreton",

         },
        {
        "title": "Blog Post Two",
        "body": [
          "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorem deleniti quae, neque libero voluptate maiores ullam unde voluptatem assumenda velit dolores impedit quis qui! Neque, cupiditate labore nulla? Atque, tenetur.",
          "Numquam nobis nam voluptas blanditiis eveniet in quasi possimus voluptatem temporibus doloremque delectus dolorum, voluptatum laborum aut dolorem? In rerum necessitatibus soluta incidunt nihil numquam fugit quas pariatur dolores nesciunt?",
          "Quibusdam placeat quisquam iure repellendus ad in, nihil numquam quaerat, facere alias illo. Tempora perferendis incidunt, ratione eveniet esse earum, corporis sit? Modi enim commodi odio placeat minus, error id?",
          "Corrupti voluptates asperiores ratione laudantium, eveniet molestiae possimus deleniti officia, incidunt quae et. Amet, ducimus eum ipsa reprehenderit ad, et nihil, veritatis ea doloremque ab placeat dolore impedit, quia eius."
        ],
        "author": "Nick Moreton",

        }


        ]
          };
          console.log('here');

            function sub(){

           localStorage.setItem('myStorage', JSON.stringify(blog));
            console.log('in sub');
            var obj = JSON.parse(localStorage.getItem('myStorage'));
            console.log('stored');
           $location.path('/another2.view');

           }

            }
  })();

So basically the onclick event isn't responding ie the function sub() is not getting initiated. 因此,基本上,onclick事件没有响应,即功能sub()没有启动。 Any help will be appreciated. 任何帮助将不胜感激。

First thing don't call global function from Angular template which are modifying controller $scope(context) variables. 首先不要从Angular模板中调用正在修改控制器$ scope(context)变量的全局函数。 It would not update bindings as it will not initiate angular digest system to update bindings. 它不会更新绑定,因为它不会启动角度摘要系统来更新绑定。

Do use ng-click instead of onclick & expose that controller function in $scope so that it can be accessible on template. 请使用ng-click代替onclick并在$scope公开该控制器功能,以便可以在模板上访问它。

Controller1.$inject = [ '$scope', '$location'];
function Controller1($scope, $location) {

   //Inject $scope in dependency array
   $scope.sub = sub; //add this line inside controller
   //other code as is
}

Template 模板

ng-click="sub()"

But as you already calling sub on ng-submit you don't have to call it again on click , so just remove onclick event from button . 但是,由于您已经在ng-submit上调用了sub ,因此不必在click再次调用它,因此只需从button删除onclick事件button

First problem with your code is 您的代码的第一个问题是

angular.module('portal').controller('Controller1', Controller1);

If you have not already declared portal module somewhere else, you have to use this 如果您尚未在其他地方声明portal模块,则必须使用它

angular.module('portal', []).controller('Controller1', Controller1);

then assign sub function to the $scope so that it will be accessible from the view 然后将sub分配给$scope以便可以从view访问它

 $scope.sub = function sub() {
     alert("sub function called");
     localStorage.setItem('myStorage', JSON.stringify(blog));
     console.log('in sub');
     var obj = JSON.parse(localStorage.getItem('myStorage'));
     console.log('stored');
     $location.path('/another2.view');
 }

You can remove the onclick='sub()' and don't even need ng-click event if you have ng-submit on form . 您可以删除 onclick='sub()' ,如果在form上执行ng-submit ,甚至不需要ng-click事件。

It is recommended , within a form you should either use ng-click or ng-submit in order to prevent double execution of the handler. 建议在表单中使用ng-clickng-submit ,以防止重复执行处理程序。

Plunker . 柱塞

As above answered, sub() should be under $scope which will expose to the view. 如上回答,sub()应该在$ scope下,它将显示给视图。 Normal function will be private to that function and will not available at view binding. 普通函数将对该函数私有,并且在视图绑定时将不可用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM