当前位置: 首页 > 面试题库 >

了解Angular.js控制器参数

阎经武
2023-03-14
问题内容

我刚刚开始学习Angular.js,并且一直在Angular主页上的“连接后端”示例中查看project.js。

我对控制器功能中的参数感到困惑:

function ListCtrl($scope, Projects) {
  ... 
}

function CreateCtrl($scope, $location, $timeout, Projects) {
  ... 
}

function EditCtrl($scope, $location, $routeParams, angularFire, fbURL) {
   angularFire(fbURL + $routeParams.projectId, $scope, 'remote', {}).
   then(function() {
     ...
   });
}

这些控制器函数在routeProvider中调用,但未给出任何参数。

$routeProvider.
  when('/', {controller:ListCtrl, templateUrl:'list.html'}).
  when('/edit/:projectId', {controller:EditCtrl, templateUrl:'detail.html'}).
  when('/new', {controller:CreateCtrl, templateUrl:'detail.html'}).
  otherwise({redirectTo:'/'});
});

我能找到到目前为止,这可能解释发生了什么事情的唯一的事情是“注入服务整合到控制器”,这说明$location$timeout而不是参数的方法angularFirefbURL

我的具体问题是:

  1. 控制器参数是什么?

  2. 带有参数的控制器功能在哪里调用?还是不调用参数,而只是与控制器相关联的东西,其中发生了很多Angular.js魔术(如果是这样,我可以在github上查看源代码)吗?

  3. 在哪里angularFire定义?

  4. fbURL参数中的如何链接到:

    angular.module('project', ['firebase']).
    value('fbURL', 'https://angularjs-projects.firebaseio.com/').
    factory ...
    
  5. 在哪里可以看到Angular.js提供的所有服务,例如$location$timeout?(我试图找到列表,但失败了。)


问题答案:
  • 控制器参数是什么?

该控制器的参数是 依赖关系 ,其被 注入 由AngularJS喷射器的服务。他们可以是任何东西。但是它们通常是将在控制器内部使用的
服务

  • 带有参数的控制器功能在哪里调用?

控制器,指令,过滤器,服务以及AngularJS中的许多其他东西都是 函数 。但是该框架管理着许多 何时 以及 如何 调用这些功能。

您所说的 与之相关的事物 具有一个名称: dependency ,如上所述。您所说的 魔术 是实际使用的AngularJS
依赖项注入 机制

当注入器调用这些函数(控制器和其他函数)时,它将读取参数名称(例如:$scope$httpangularFire)并搜索具有该名称的注册服务,然后在调用该函数时将其作为参数提供。

很简单。您可以通过多种方法来指导您对注射器的“依赖关系”(由注射器管理的参数)。

当您简单地将函数声明为时function myCtrl($scope) {},注入器将能够$scope从参数名称中找到服务。但是,如果您
最小 化JavaScript代码,则注入器将不再能够找到服务,因为参数名称将被修改为较小的字符串,例如“ a”或“ x”。为避免此问题,可以使用
数组符号 指定要注入的服务名称。在这种情况下,您可以这样声明函数:myCtrl = ['$scope', function($scope) {}]

您将在AngularJS世界中看到很多 数组符号 用法。现在您开始了解它。你甚至可以注入$scope,并angularFire与使用它们
的其他名字 在你的函数(更改名称是 不建议 -在这里这个例子是为了学习目的):['$scope', 'angularFire', function(skop, af) {}]-这样一来,在函数内部可以使用$范围为“skop”和angularFire为“ af”。该 顺序
数组中的服务相匹配的参数的顺序。

另一个例子:

var myController = ['$scope', '$resource', '$timeout',
    function($scope, $resource, $timeout) {
        // this controller uses $scope, $resource and $timeout
        // the parameters are the dependencies to be injected
        // by AngularJS dependency injection mechanism
    }
];
  • 在哪里定义angularFire?

firebase 模块中

如您现在所知,注入器将注入任何东西,只要它已注册并在其记录中可用的“事物” 名称即可 。如果有一个具有该 名称 的“服务” ,则他可以
提供

那么,如何构建name => stuff喷油器使用的清单?

模块 就是答案。一个 模块 只不过是一个列表name => stuff。在 模块中 ,您可以注册服务,工厂,过滤器,指令等。

仔细看一下官方文档中的Module方法
…几乎所有方法都作为参数接收: name* 和一些“ stuff ”(其中“ stuff”几乎总是一个 函数
定义了控制器,工厂或指令) )。正是这些“东西”将通过其指定的 名称 注入
*

默认情况下,AngularJS服务(例如“ $ timeout”,“ $ http”等)可用,因为 ng模块 已经由框架加载。

对于其他服务,您需要加载/需要 模块 。这就是你做什么 ngRouter火力 等..通过加载的 模块 ,其注册的东东都
可以注射你的 模块/应用程序。

让我们看一个分步示例:

// An empty module:
var module = angular.module('myModule', []);

// Now, adding an "injectable" constant: 
module.constant('niceStuff', { blip: 'blop', blup: 307 });

// We could add a service:
module.service('entityManager', ['$http', function($http){  }]);

// and so on... if I wanted to use "$resource" instead of "$http"
// in the entityManager service above...
// ...I would need to require the ngResource when creating the module above,
// like this: var module = angular.module('myModule', ['ngResource']);
// because "$resource" is not available by default

// NOW, anywhere else, since the code above already ran
// I can use those NAMES as dependencies like this:

// We are creating another module now:
var koolModule = angular.module('km', ['myModule']);
// Note that I am requiring the previous module through its registered name

// Now, anything I've declared in that module
// - just like "ng" (by default) and "firebase" (required) does -
// is available for "injection"!!!

koolModule.controller('koolController',
    ['niceStuff', 'entityManager', function(niceStuff, entityManager) {
        console.log(niceStuff.blip);      // 'blop'
        console.log(niceStuff.blup + 10); // 317
    }]
);

这就是Firebase之类的东西(例如angularFire)变得可用的方式!我们做了什么?首先,我们创建了“
myModule”,并向其中注册了NAMED内容。后来,我们需要为“ koolModule”使用“ myModule”-并且这些名称已经在注射器name => stuff列表中可用。

  • 如何在参数中链接fbURL

正如我们已经看到的,大多数 模块方法 只是注册事物-给事物 命名 ,以便以后可以通过这些名称 注入 和/或使用它们。

module.value('fbURL', 'https://angularjs-projects.firebaseio.com/')被调用时,
fbURL (和指定值)登记在name => stuff列表…在这种情况下,名称为“fbURL”,和值/东西是URL字符串-
但它可以是任何东西!

  • 是否可以在其中看到Angular.js提供的所有服务,例如$ location和$ timeout?

是的,API参考:http :
//docs.angularjs.org/api/

注意 模块 左侧导航的组织 方式!首先是 ng
模块,其中包含大量指令,服务,过滤器等。然后,下面是其他模块(ngRoute,ngResource,ngMock等),每个模块都包含自己的服务,适配程序或指令。

感谢您分享这些想法的机会。我喜欢写它们。



 类似资料:
  • 问题内容: 我想延迟控制器的初始化,直到从服务器收到必要的数据为止。 我找到了针对Angular1.0.1的解决方案:延迟AngularJS路由更改,直到加载模型以防止闪烁,但无法使其与Angular1.1.0一起使用 模板 ​ JavaScript http://jsfiddle.net/dTJ9N/1/ 问题答案: 由于$ http返回了promise,因此创建自己的deferred仅在htt

  • 问题内容: 如果您有一个控制器来操作Angular.js中的$ scope变量,是否有惯用的方法: 重置控制器的$ scope,然后 重新启动控制器初始化? 对于复杂的控制器,不必将每个变量都重置为其初始值将非常方便,特别是如果您真正想要的是对控制器和范围进行简单的重新初始化。通过再次导航到相同的URL 并没有帮助。 编辑:假设我不能使用任何黑客工具,因为这会违反Chrome打包应用中的CSP。

  • 问题内容: 我是angularjs的新手,我知道它表示控制器和视图之间的连接,但是除了寻求获取scope元素之外,还有没有其他办法,我的意思是这样的: 我知道可以将同一控制器分配给多个作用域,所以也许是不可能的。 问题答案: 您可以将元素传递给控制器​​,就像作用域一样:

  • 问题内容: 这是一个现实的Angular问题,我无法解决。我喜欢Angular,但是这个问题现在困扰着我很多。 扩展现有控制器功能,并在应用程序的另一页上使用扩展控制器的最佳实践是什么?换句话说: 如何在Angular中继承控制器? 编辑 -2014年9月23日,不要以为我的原始用例的描述会帮助访问者更好地理解我在这里的用意。我认为这使人们偏离了真正的问题。 问题答案: 半年后,我想我完全了解发生

  • 问题内容: 我是angular的新手,我想知道如何在angular的控制器之间共享变量。我正在使用以下脚本- 在Main.js中: 在Index.html中 我正在发送数据并接收响应的ajax一切正常,我的问题如下: 在SearchCtrl函数中,我有一个名为$ scope.result的变量,稍后在Index.html中进行引用。如果我将包含该变量的html代码插入SearchCtrl控制器,则

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?