zoukankan      html  css  js  c++  java
  • Angularjs之依赖注入

    一个对象通常有三种方式可以获得对其依赖的控制权:

    1. 在内部创建依赖;
    2. 通过全局变量进行引用;
    3. 在需要的地方通过参数进行传递

    依赖注入是通过第三种方式实现的。比如:

    function SomeClass(greeter) {
    this.greeter = greeter;
    }
    SomeClass.prototype.greetName = function(name) {
    this.greeter.greet(name);
    };

    SomeClass能够在运行时访问到内部的greeter,但它并不关心如何获得对greeter的引用。
    为了获得对greeter实例的引用,SomeClass的创建者会负责构造其依赖关系并传递进去。

    基于以上原因,AngularJS使用$injetor(注入器服务)来管理依赖关系的查询和实例化。
    事实上,$injetor负责实例化AngularJS中所有的组件,包括应用的模块、指令和控制器等。

    例如下面这段代码。这是一个简单的应用,声明了一个模块和一个控制器:

    angular.module('myApp', [])
    .factory('greeter', function() {
    return {
    greet: function(msg) {alert(msg);}
    }
    })
    .controller('MyController',
    function($scope, greeter) {
    $scope.sayHello = function() {
    greeter.greet("Hello!");
    };
    });

    当AngularJS实例化这个模块时,会查找greeter并自然而然地把对它的引用传递进去:

    <div ng-app="myApp">
    <div ng-controller="MyController">
    <button ng-click="sayHello()">Hello</button>
    </div>
    </div>

    而在内部,AngularJS的处理过程是下面这样的:

    // 使用注入器加载应用
    var injector = angular.injector(['ng', 'myApp']);
    // 通过注入器加载$controller服务:var $controller = injector.get('$controller');
    var scope = injector.get('$rootScope').$new();
    // 加载控制器并传入一个作用域,同AngularJS在运行时做的一样
    var MyController = $controller('MyController', {$scope: scope})
  • 相关阅读:
    Zabbix监控mysql配置及故障告警配置
    Tesseract-OCR 字符识别---样本训练
    Wex5案例使用JSON传输Thinkphp后端对接,以达成数据正常输出
    Linux内核分析:recv、recvfrom、recvmsg函数实现
    libevent源码分析:evmap_io_active_函数
    libevent源码分析:epoll后端实现
    监听套接字不可写?
    Linux内核分析:dup、dup2的实现
    Linux内核分析:打开文件描述符实现
    libevent源码分析:http-server例子
  • 原文地址:https://www.cnblogs.com/hutuzhu/p/4360215.html
Copyright © 2011-2022 走看看