module是angular中重要的模块组织方式,它提供了将一组内聚的业务组件(controller、service、filter、directive…)封装在一起的能力。这样做可以将代码按照业务领域问题分module的封装,然后利用module的依赖注入其关联的模块内容,使得我们能够更好的”分离关注点“,达到更好的”高内聚低耦合“。”高内聚低耦合“是来自面向对象设计原则。内聚是指模块或者对象内部的完整性,一组紧密联系的逻辑应该被封装在同一模块、对象等代码单元中,而不是分散在各处;耦合则指模块、对象等代码单元之间的依赖程度,如果一个模块的修改,会影响到另一个模块,则说明这两模块之间是相互依赖紧耦合的。
同时module也是我们angular代码的入口,首先需要声明module,然后才能定义angular中的其他组件元素,如controller、service、filter、directive、config代码块、run代码块等。
关于module的定义为:angular.module(‘com.ngbook.demo', [])。关于module函数可以传递3个参数,它们分别为:
对于angular.module方法,我们常用的方式有有种,分别为angular.module(‘com.ngbook.demo', [可选依赖])和angular.module(‘com.ngbook.demo')。请注意它是完全不同的方式,一个是声明创建module,而另外一个则是获取已经声明了的module。在应用程序中,对module的声明应该有且只有一次;对于获取module,则可以有多次。推荐将angular组件独立分离在不同的文件中,module文件中声明module,其他组件则引入module,需要注意的是在打包或者script方式引入的时候,我们需要首先加载module声明文件,然后才能加载其他组件模块。
在angular中文社区群中,有时会听见某些同学问关于”ng:areq“的错误:
[ng:areq] Argument 'DemoCtrl' is not a function, got undefined!
这往往是因为忘记定义controller或者是声明了多次module,多次声明module会导致前边的module定义信息被清空,所以程序就会找不到已定义的组件。这我们也能从angular源码中了解到(来自loader.js):
function setupModuleLoader(window) { ... function ensure(obj, name, factory) { return obj[name] || (obj[name] = factory()); } var angular = ensure(window, 'angular', Object); return ensure(angular, 'module', function() { var modules = {}; return function module(name, requires, configFn) { var assertNotHasOwnProperty = function(name, context) { if (name === 'hasOwnProperty') { throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); } }; assertNotHasOwnProperty(name, 'module'); if (requires && modules.hasOwnProperty(name)) { modules[name] = null; } return ensure(modules, name, function() { if (!requires) { throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + "the module name or forgot to load it. If registering a module ensure that you " + "specify the dependencies as the second argument.", name); } var invokeQueue = []; var runBlocks = []; var config = invokeLater('$injector', 'invoke'); var moduleInstance = { _invokeQueue: invokeQueue, _runBlocks: runBlocks, requires: requires, name: name, provider: invokeLater('$provide', 'provider'), factory: invokeLater('$provide', 'factory'), service: invokeLater('$provide', 'service'), value: invokeLater('$provide', 'value'), constant: invokeLater('$provide', 'constant', 'unshift'), animation: invokeLater('$animateProvider', 'register'), filter: invokeLater('$filterProvider', 'register'), controller: invokeLater('$controllerProvider', 'register'), directive: invokeLater('$compileProvider', 'directive'), config: config, run: function(block) { runBlocks.push(block); return this; } }; if (configFn) { config(configFn); } return moduleInstance; function invokeLater(provider, method, insertMethod) { return function() { invokeQueue[insertMethod || 'push']([provider, method, arguments]); return moduleInstance; }; } }); }; }); }
在代码中,我们能了解到angular在启动时,会设置全局的angular对象,然后在angular对象上发布module这个API。关于module API代码,能清晰的看见第一行谓语句,module名称不能以hasOwnProperty命名,否则会抛出”badname“的错误信息。紧接着,如果传入了name参数,其表示是声明module,则会删除已有的module信息,将其置为null。
从moduleInstance的定义,我们能够看出,angular.module为我们公开的API有:invokeQueue、runBlocks、requires、name、provider、factory、servic、value、constant、animation、filter、controller、directive、config、run。其中invokeQueue和runBlocks是按名约定的私有属性,请不要随意使用,其他API都是我们常用的angular组件定义方法,从invokeLater代码中能看到这类angular组件定义的返回依然是moduleInstance实例,这就形成了流畅API,推荐使用链式定义这些组件,而不是声明一个全局的module变量。
最后,如果传入了第三个参数configFn,则会将它配置到config信息中,当angular进入config阶段时,它们将会依次执行,进行对angular应用或者angular组件如service等的实例化前的配置。
以上就是对Angular Module声明和获取重载的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
问题内容: 我了解“隐式声明”通常意味着必须在调用函数之前将其置于程序的顶部,否则我需要声明原型。 但是,应该在文件中(该文件已包含在内)。 有没有什么办法解决这一问题? 问题答案: 没错,如果您包含适当的标头,则不应收到隐式声明警告。 然而,该功能已被 删除 ,从C11的标准。这意味着in中不再有原型。 曾经 在。 删除的原因是众所周知的:它不能防止缓冲区溢出。因此,您永远不应使用,而应改用尾随
本文向大家介绍Android 获取时间实例代码,包括了Android 获取时间实例代码的使用技巧和注意事项,需要的朋友参考一下 Android 获取时间实例代码 注意: h:12小时制小时数 H:24小时制小时数 实例代码: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
我无法打印已声明的字符串。以下是代码: 下面是错误:
我对java.sql.Statement的方法getGeneratedKeys()有问题 首先我的代码: 创造sql:(HSQLDB) 从DAO创建方法: 然后,我对生成的密钥进行了单元测试: 当我运行测试时,我得到一个失败和以下日志: 所以问题是
在Haskell中,当定义一个数据类型时,您可以选择自动派生一些实例,但我是否可以推迟自动派生,甚至可以将其放到另一个库中? 这里有一个例子: 在Haskell自动派生是一个实时节省! 最好用丢失的实例修补实际中的问题。 认为有孤立实例是不好的。实例声明最好放在定义类型类或数据类型的模块中。 在我的例子中,我不能遵循最佳实践,因为type类与数据类型无关。我怀疑type class模块和data
本文向大家介绍Dojo获取下拉框的文本和值实例代码,包括了Dojo获取下拉框的文本和值实例代码的使用技巧和注意事项,需要的朋友参考一下 Dojo Dojo是一个用javascript语言实现的开源DHTML工具包。它是在几个项目捐助基础上建立起来的(nWidgets,Burstlib,f(m)),这也是为什么叫它a"unified"toolkit的原因。Dojo的目标是解决开发DHTML应用程序遇