javascript - Angular Controller 代码中未定义全局函数

标签 javascript angularjs

我有一个全局函数声明如下(仅必要的位):

initiateCheckList = {};

$(function() {

    initiateCheckList = function() {
    ...
    }

然后我在 Angular Controller 中有一个函数尝试调用该函数,但是当调用以下函数时,我收到错误 initiateCheckList is not Define:

$scope.updateSuburbs = function () {
    $scope.suburbs.getModel($scope.areas.areaId);
    initiateCheckList();
};

此函数嵌套在 Controller 内,并绑定(bind)到下拉 change 事件,如下所示:

<select class="form-control" ng-model="areas.areaId" ng-change="updateSuburbs()">

Angular 做了什么,导致我无法调用全局函数?如何修复问题以便可以调用它?

最佳答案

以下是在 Angular 中定义全局属性/函数的理想方式:

对于“全局”变量,您基本上有 2 个选项:

use a $rootScope [http://docs.angularjs.org/api/ng.$rootScope][1]
use a service [http://docs.angularjs.org/guide/services][1]

$rootScope 是所有范围的父级,因此公开的值将在所有模板和 Controller 中可见。使用 $rootScope 非常简单,因为您可以简单地将其注入(inject)任何 Controller 并更改此范围内的值。它可能很方便,但存在全局变量的所有问题。

服务是单例,您可以将其注入(inject)任何 Controller 并在 Controller 的范围内公开它们的值。作为单例的服务仍然是“全局的”,但您可以更好地控制这些服务的使用和公开位置。

使用服务有点复杂,但也不是那么复杂,下面是一个例子:

var myApp = angular.module('myApp',[]);
myApp.factory('UserService', function() {
  return {
      name : 'anonymous',
      printData: function() {console.log('Print Data');}
  };
});

然后在 Controller 中:

function MyCtrl($scope, UserService) {
    $scope.name = UserService.name;

    UserService.printData();
}

我希望它能帮助您理解在 Angular 中添加全局属性/函数。

关于javascript - Angular Controller 代码中未定义全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37375514/

相关文章:

angularjs - 是否可以将提供程序注入(inject)到 AngularJs 中的服务中?

javascript - 带计算的 Angular 数据绑定(bind)

javascript - Angular Material : show menu icon when sidenav collapses

angularjs - 如何通过递归请求来访问父指令的 Controller ?

javascript - 为什么 JavaScript 参数有 length 属性而其他对象没有?

javascript - 想要在我的按钮单击事件中使用 ajax 多个文件上传

javascript - Rocket.Chat 构建失败,错误为 "Cannot find module ' ../build/Release/sharp.node' "

javascript - 元素闪烁

javascript - 在 XMLHttpRequest 中设置授权 header 更改 HTTP 动词

node.js - 我如何在 Nitrous.IO 上设置 MEAN(Mongodb、Express、Angular 和 Node)堆栈