如何从控制器内部的javascript函数调用角度作用域函数

如何从控制器内部的javascript函数调用角度作用域函数,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我在函数中有角度控制器和Javascript函数,我调用角度函数。我收到错误:$scope.Name不是函数,$scope.dates不是函数 function validation() { $scope.pageload = true; $scope.Name(); $scope.dates(); } $scope.Name = function () {

我在函数中有角度控制器和Javascript函数,我调用角度函数。我收到错误:$scope.Name不是函数,$scope.dates不是函数

     function validation() {
            $scope.pageload = true;

            $scope.Name();
            $scope.dates();  
        }

        $scope.Name = function () {
           // do something
        }

        $scope.dates = function () {
          // do something       
        }
控制器内部工作正常

    var MyController = function ($scope, service)
    {


       function validation() {

            $scope.pageload = true;

            $scope.Name();
         $scope.dates();

        }

       $scope.Name = function () {


            // do something
        }

     $scope.dates = function () {

            // do something

    }


});


working:


var MyController = function ($scope, service)
{
 LoginHomeService.getHomeService(function (data) {
                $rootScope.CT1SessionObj = data.CT1SessionObj;

                        validation();



                                    }, function (response) {
                                        alert(response.Message);
                                    });

   function validation() {

        $scope.pageload = true;

        $scope.Name();
     $scope.dates();

    }

   $scope.Name = function () {


        // do something
    }

 $scope.dates = function () {

        // do something




});




Not working:

    var MyController = function ($scope, service)
    {
     LoginHomeService.getHomeService(function (data) {
                    $rootScope.CT1SessionObj = data.CT1SessionObj;

                            validation();


   function validation() {

        $scope.pageload = true;

         $scope.Name();
         $scope.dates();

        }

       $scope.Name = function () {


            // do something
        }

     $scope.dates = function () {

            // do something

    }


   }, function (response) {
    alert(response.Message);
   });


   });

将验证放在作用域函数之后

$scope.Name = function () {
   // do something
}

$scope.dates = function () {
  // do something       
}

function validation() {
    $scope.pageload = true;

    $scope.Name();
    $scope.dates();  
}

在验证()的顶部声明
$scope.Name
$scope.dates

Javascript自上而下工作,因此您的函数
$scope.Name
$scope.Dates
还不存在

此外,尽量不要将“Name”用作函数。这些词大部分是保留关键字

var myApp = angular.module('myApp', []);

//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});

function MyCtrl($scope) {

    $scope.Name = function() {
    // do something
  }

  $scope.dates = function() {
    // do something       
  }

  function validation() {
    $scope.pageload = true;

    $scope.Name();
    $scope.dates();
  }
}
小提琴:

更好的方法是“约翰·帕帕风格”:

将可绑定成员按字母顺序放置在控制器的顶部,不要在控制器代码中散布

为什么?:将可绑定的成员放在顶部便于阅读和编辑 帮助您立即识别控制器的哪些成员可以 绑定并在视图中使用

为什么?:在线设置匿名函数很容易,但是 函数是一行以上的代码,它们可以减少 可读性。在可绑定成员( 功能将被提升)向下移动实施细节, 将可绑定成员保持在顶部,使其更易于阅读


正如@Harald Wiesinger提到的,在调用函数之前声明调用的函数

所有这些代码都在哪里?这都是在控制器内部还是…?从某个地方调用
validation()
您可能想要创建一个Plunker:在控制器内部不调用服务在服务内部调用验证javascript函数,在js函数中调用角度函数。在控制器内部工作,出于某些原因,我在服务响应中添加了一些内容。如果你想提及某人,请使用评论而不是回答
/* avoid */
function SessionsController() {
    var vm = this;

    vm.gotoSession = function() {
      /* ... */
    };
    vm.refresh = function() {
      /* ... */
    };
    vm.search = function() {
      /* ... */
    };
    vm.sessions = [];
    vm.title = 'Sessions';
}


/* recommended */
function SessionsController() {
    var vm = this;

    vm.gotoSession = gotoSession;
    vm.refresh = refresh;
    vm.search = search;
    vm.sessions = [];
    vm.title = 'Sessions';

    ////////////

    function gotoSession() {
      /* */
    }

    function refresh() {
      /* */
    }

    function search() {
      /* */
    }
}