了解Angular.js控制器参数

我刚刚开始学习Angular.js,并在Angular主页的“Wire up a Backend”示例中查看了project.js 。

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

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:'/'}); }); 

到目前为止唯一能find的可能解释是“将服务注入到控制器中” ,它解释了$location$timeout ,但是不包含方法angularFirefbURL

我的具体问题是:

  1. 控制器参数是什么?

  2. 控制器的function在哪里用它们的参数调用? 或者参数不被调用,但只是与控制器相关联的东西与许多Angular.js魔术(如果是的话,我可以在github上看到的源代码)?

  3. angularFire在哪里定义?

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

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

  • 控制器参数是什么?

    控制器参数是依赖项 ,由AngularJS注入器服务注入 。 他们可以是任何东西。 但他们通常是在控制器内部使用的服务

  • 控制器的function在哪里用它们的参数调用?

    控制器,以及指令,filter,服务和AngularJS中的其他许多东西都是函数 。 但是这个框架pipe理着什么时候以及如何调用这些函数。

    如上所述,您称之为关联的东西具有名称: 依赖关系 。 你所说的魔术就是AngularJS dependency injection机制。

    当注入器调用这些函数(控制器和其他函数)时,它会读取参数名称(例如: $scope$http或者angularFire ),然后search具有该名称的注册服务,然后将其作为参数提供函数被调用。

    很简单。 您可以通过多种方式指示喷油器的“依赖性”(由喷油器pipe理的参数)。

    当你简单地声明你的函数为function myCtrl($scope) {} ,注入器将能够从参数名称中find$scope服务。 但是,如果您缩小了JavaScript代码,注入器将不能再find该服务,因为参数名称将被修改为较小的string,如“a”或“x”。 为了避免这个问题,可以使用数组表示法来指定要注入的服务名称。 在这种情况下,你会声明你的函数是这样的: myCtrl = ['$scope', function($scope) {}]

    您将在AngularJS世界中看到很多数组符号的用法。 现在你开始了解它。 你甚至可以注入$scopeangularFire并在你的函数中使用其他名字 (改变名字不build议 – 这个例子是为了学习的目的): ['$scope', 'angularFire', function(skop, af) {}] – 这样,在函数内部,可以使用$ scope作为“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 模块

    正如你现在已经知道的那样,只要注射器上有“事物”的名字 ,注射器就会注入任何东西。 如果有这个名字的“服务”,他能够提供

    那么,如何构build这个name => stuff注入器使用的name => stuff列表?

    模块就是答案。 一个模块只不过是name => stuff的列表。 它位于注册服务,工厂,filter,指令等模块中。

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

    像“$ timeout”,“$ http”之类的AngularJS服务默认是可用的,因为ng模块已经被框架加载了。

    对于其他服务,您需要加载/需要模块 。 这就是你用ngRouterfirebase等做的事情……通过加载模块 ,注册的东西可用于注入 你的模块/应用程序。

我们来看一个循序渐进的例子:

 // 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 }] ); 

这就是像fireFire这样的火力点东西变得可用! 我们做了什么? 首先,我们创build了“myModule”,并注册了NAMED的东西。 后来,我们需要“myModule”作为我们的“koolModule” – 这些name => stuff已经在注入器name => stuff列表中可用。

  • 参数中的fbURL如何链接

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

    module.value('fbURL', 'https://angularjs-projects.firebaseio.com/')fbURL (和指定的值)被注册到name => stuff列表中…在这种情况下,名称是“fbURL”,值/东西是URLstring – 但它可以是任何东西!

  • 有没有一个地方可以看到Angular.js提供的所有服务,例如$ location和$ timeout?

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

    注意左侧的导航是如何组织的 …由模块 ! 首先, ng模块包含了大量的指令,服务,filter等。下面是其他模块(ngRoute,ngResource,ngMock等),每个模块都包含自己的服务,assembly者或指令。

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

控制器的function在哪里用它们的参数调用?

控制器函数通过ngController指令实例化,或者如果您在使用$routeProvider创build路由的过程中提到了控制器。 AngularJS为你做了这个转换,并使用DI注入你在控制器上定义的参数。

DI通过匹配参数的名称(或某些时间顺序)进行工作。 所以$scope将得到当前范围, $http将得到http服务

首先select这个框架很好。 这是最好的。 你看到的$符号的variables是注入的,也是标准框架的一部分。 这些服务将使您的生活变得如此简单。 思考控制器的最好方法是它们是脚本表。 他们帮助分离代码。 不要把它们看成是方法。 你看到的那些variables,例如$ timeout&$ scope是服务,当你需要完成一些事情时,这些服务将派上用场。 该框架的所有文档在http://docs.angularjs.org/api/,但是我将从本教程http://docs.angularjs.org/tutorial/开始。;

篝火不是框架的一部分。 这是利用框架来创build强大的实时分布式networking的另一项服务。 当你加载angularfirejs时,它会提供服务,然后将其作为参数注入。

要回答你的第二个问题,只要你做出相应的服务,你传递的参数就可以是任何东西。 请参考这个为控制器创build自己的参数: http : //docs.angularjs.org/guide/dev_guide.services.creating_services

fbURL只是一个你可以创build的variables,你放在你的问题中的代码只是如何做的说明。

Angularjs不是你可以通过查看它提供的框架的types。 只是因为它提供了一切。 一切你可能会带来一个伟大的应用程序。 相反,你应该专注于问谷歌如何解决你的问题与angular度。

也可以在YouTube上查看video。 你会发现一些伟大的。

根据toxaq评论,这里是评论作为答案

  1. 控制器参数是什么?

    它可以主要是服务,工厂,价值观,常量等…你已经定义了某个地方之前或使用路线定义的解决scheme。

  2. 控制器的function在哪里用它们的参数调用?

    这是定义控制器的正确方法:

     angular.module('project').controller('EditCtrl', [ '$scope', '$location', '$routeParams', 'angularFire', 'fbURL', function($scope, $location, $routeParams, angularFire, fbURL) { ... } ]); 

    这样,您首先设置要注入的服务的名称,然后如果您愿意,可以给这些服务一个不同的名称。 事实上,如果你想最小化你的angular码,这是必须的(因为最小化将重命名variables,angular度需要仍然能够find服务名称)。

  3. angularFire在哪里定义?

    在定义项目模块时,还包括了Firebase模块依赖性。 在firebase模块内部,必须有一个像以前的fbURL一样的angularFire服务。

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

    就像你似乎理解的那样,控制器的参数是从控制器的定义angular度注入的。 Angular会查看所有注册的服务,并尝试find与指定的参数名称匹配并注入相应的服务!

  5. 有没有一个地方可以看到Angular.js提供的所有服务,例如$ location和$ timeout?

    有关所有内置服务的列表,包括在Angular中的filter,指令,请看API: http : //docs.angularjs.org/api