caoruiy‘s blog

Wisdom outweighs any wealth

Angular-API-service-$controller

原文地址:/ API Reference / ng / service components in ng / $controller

$controller负责实例化控制器。

这只是个简单的$injector调用,但为了以前版本的这个服务能被覆盖而被提取进一个服务。

Dependencies 依赖

$injector

Usage

$controller(constructor,locals);
– constructor:如果调用了一个函数,那么这个函数被认为是控制器构造函数。否则,它被认为是一个使用以下步骤检索控制器的构造函数的字符串:
1. 检查控制器是否在$controllerProvider注册并命名。

  1. 检查当前作用域上的字符串是否返回一个构造函数

  2. 在全局window对象上检查构造器。

  • locals:Object,将需要调用的依赖注册到当前控制器。

    对locals这个参数可能不好理解,可以这样说:比如你的控制器需要依赖注入,你通常会写:app.controller('ctrlName',['$scope','$q',function($scope,$q){}]),那么,$scope$q 是系统帮你注入的。

    假如,你希望你可以控制注入,那么locals就可以帮你实现。比如,你想注入一个你指定的$scope,可以写:

    $scope = {name : 'zhangsan'};
    $controller('ctrlName',{$scope:$scope});
    

    这样,系统会在依赖注入的时候,优先查找你指定的服务或者对象是否存在,如果存在,则使用你提供的,否则,则会自动从系统注册的服务中调用。

    通过这个方法,你可以给指定控制器,注入一些对象,比如,有下面这样一个控制器,其中selfObj是一个你想手动注入的对象:

    app.controller('ctrlName',['$scope','selfObj', function($scope, selfObj){}]);
    
    $scope = {name : 'zhangsan'};
    $controller('ctrlName',{$scope:$scope, selfObj:{name:'selfObj'}})
    

    通过上面的方法,$controller就会把你想要的数据注入到控制器中。

下面是一个简单的应用示例:

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

app.service('ser',function(){
    this.name = 'ser'
})
app.controller('ctrl', ['$scope', function($scope){
    // 会被返回的对象获取
    this.hello = function(){
        alert('hello');
    }
    // 或被$scope获取
    $scope.hello = function(){
        console.log('hello');
    }
}])
// 控制器 frist
app.controller('first',['$controller','$scope',function($controller,$scope){   
    // 把当前的$scope 和 ctrl 中的 $scope 绑定。并返回控制器对象的实例
    var ctrl = $controller('ctrl',{$scope:$scope});
    // 所以ctrl可以调用ctrl中this下的方法
    ctrl.hello();
    // 而$scope可以拿到ctrl下$scope中的内容
    $scope.hello();

}])



点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注