angular 提供了一套依赖注入的机制,和后台很像。虽然我不觉得有很重要。

var $injector = angular.injector(["myModule"]);
var serviceInstance = $injector.get("serviceName"); //可以获取到service 

has_service = $injector.has("serviceName");
$injector.invoke(['serviceA', function(serviceA){}]); //我们很多函数都是通过这个方式实现依赖注入和执行的 


        var output = '<div>' +
'<div>' +
'{{name}}' +
'</div>' +
'</div>';
var $injector = angular.injector(["ng"]);
$injector.invoke(["$rootScope", "$compile", function ($rootScope, $compile) {
var scope = $rootScope.$new(); //创建继承scope
scope.name = "933";
var link = $compile(output); //编辑 {{}}也是指令的一种
var node = link(scope); //与scope绑定
$rootScope.$digest(); //渲染
document.body.appendChild(node[0]);
}]);
这是一个手动的解析过程,大致了解一下解析过程.

更新 2015-10-14 
循环依赖 error
app.config(["$httpProvider", function ($httpProvider) {
$httpProvider.interceptors.push(["Account.user", "$injector", function (user, $injector) {
//note : set all ajax request header for premission
return {
request: function (config) {
var accountService = $injector.get("Account.service"); //note : manual inject, prevent 循环依赖
log(accountService);
log("prevent 循环依赖成功");
config.headers = config.headers || {};
if (user.account) config.headers["selectedAccountTypeName"] = accountService.getTypeNameFromOdataTypeName(user.account["@odata.type"]);
if (user.role) config.headers["selectedRoleTypeName"] = accountService.getTypeNameFromOdataTypeName(user.role["@odata.type"]);
return config;
},
};
}]);
}]);
上面的这个例子,假设 Account.user这个service 依赖注入了 $http 那么这里就会报错了. 
推出是因为angular 并不是等到$http service 完成后才去依赖注入 Account.user的。
要解决这个问题我们可以注入 $injector 然后手动调用 $injector.get("Account.user") 来获取service, 当然手动的话自己就要搞清楚顺序啦 ^^

 

injector的更多相关文章

  1. angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- testServe

    angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- testSer ...

  2. AngularJS API之$injector ---- 依赖注入

    在AngularJS中也有依赖注入的概念,像spring中的依赖注入,但是又有所不同.Spring中使用构造注入或者设值注入的方式,还需要做一些额外的操作,但是angular中只需要在需要的地方声明一 ...

  3. AngularJS源码分析之依赖注入$injector

    开篇 随着javaEE的spring框架的兴起,依赖注入(IoC)的概念彻底深入人心,它彻底改变了我们的编码模式和思维.在IoC之前,我们在程序中需要创建一个对象很简单也很直接,就是在代码中new O ...

  4. angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。

    最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ...

  5. 给返回的injector增加了一个invoke方法

    我们知道,这里swap只需交换指针指向就可以,所以我们可以写出如下自定义版本的swap函数: 首先,它把一个独立的文件看成一个模块,比如上面的 hello.js 文件,就可以当成一个模块.模块的名称就 ...

  6. Nutch主要类代码分析之一(Injector)

    Injector(org.apache.nutch.crawl.Injector): 输入:种子列表文件所在的目录 输出:crawldb(保存URL以及其相应信息的数据库) 作用:把种子URL注入到c ...

  7. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  8. AngularJs angular.injector、angular.module

    angular.injector 创建一个injector对象, 调用injector对象的方法可用于获取服务以及依赖注入. 格式:angular.injector(modules); modules ...

  9. (七)理解angular中的module和injector,即依赖注入

    (七)理解angular中的module和injector,即依赖注入 时间:2014-10-10 01:16:54      阅读:63060      评论:1      收藏:0      [点 ...

  10. angularJs $injector

    一 angularJS中几种注入方式 Spring中使用构造注入或者设值注入的方式,还需要做一些额外的操作,但是angular中只需要在需要的地方声明一下即可,类似模块的引用,因此十分方便. angu ...

随机推荐

  1. Qt编程之右键单击QTreeWidgetItem弹出菜单

    其实有这个需求很好理解,就是我有个project manager,上面的TreeWidgetItem都表示一个工程,我需要右键创建新的工程,或者删除.这个在很多普通软件中也见得多.在弹出的菜单中加入相 ...

  2. rsyslog 读取单个文件测试

    rsyslog 测试(rsyslog 必须yum 安装uat-web02:/root# rpm -qa | grep rsyslog rsyslog-8.21.0-1.el6.x86_64) //读取 ...

  3. Linux企业级项目实践之网络爬虫(26)——线程池

    一旦有一个抓取请求开始,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出.这就是"即时创建,即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但 ...

  4. cocos2d-x多分辨率适配原理分析(2.0.4之后的版本)

    2013年11月4日补充: 之前写这篇博客的时候其实我还没有开始过真正的去做一个项目,主要过程还是偏向于理解原理.前几天在准备练练手时回过头来想了下这个问题,发现又有点一头雾水了,所以我觉得之前我并没 ...

  5. HDOJ 2191

    多重背包. 模版. #include <iostream> #include <stdio.h> #include <stdlib.h> #include < ...

  6. Solr4.4.0部署到tomcat上

    主要步骤如下: 1.下载solr-4.4.0.tgz 2.解压缩solr-4.4.0.tgz,命令tar -xzvf solr-4.4.0.tgz 3.压缩后进入到solr-4.4.0目录,将 exa ...

  7. java,大数据批量插入、更新

    public void exec(Connection conn){ try { conn.setAutoCommit(false); Long beginTime = System.currentT ...

  8. eclipse format的时候如何让@param后不换行

  9. 导航条上UIBarButtonItem的更改方法(使用initWithCustomView:btn)

    UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:self.newMe ...

  10. 实现Android 动态载入APK(Fragment or Activity实现)

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 近期由于项目太大了.导致编译通只是(Android对一个应用中的方法个数貌似有 ...