我对AngularJS有一些经验,并且在网上遇到过这个指令,但它不像我以前见过的任何东西,我无法理解它在做什么?有人可以帮忙吗?
具体问题:由于缺乏了解,指令的签名必须是依赖注入。但我正在努力的是:如果在数组中传入$ injector,为什么它也作为参数发送到函数中,即函数($ injector);换句话说,为什么有两个$注射器?如果我不在数组中发送$ injector,那么什么是行不通的?
此指令又如何嵌入控制器?你什么时候定义这样的控制器?
此外,我通常会在下面的代码中看到带有$前缀的范围,如果没有$?
,它是如何工作的任何阅读更多或在此解释的链接都会很有用。
.directive('mycomp', [
'$injector', function($injector) {
var $builder, $compile, $drag;
$builder = $injector.get('$builder');
$drag = $injector.get('$drag');
$compile = $injector.get('$compile');
return {
restrict: 'A',
scope: {
component: '=mycomp'
},
controller: 'mycompController',
link: function(scope, element) {
scope.copyObjectToScope(scope.component);
$drag.draggable($(element), {
mode: 'mirror',
defer: false,
object: {
componentName: scope.component.name
}
});
return scope.$watch('component.template', function(template) {
var view;
if (!template) {
return;
}
view = $compile(template)(scope);
return $(element).html(view);
});
}
};
}
])
答案 0 :(得分:4)
为什么它也作为函数发送,即函数($ injector);换句话说,为什么有两个$注射器?
在进行数组类型注入时,调用函数中的参数并不重要,它将映射到数组项。例如,如果我们有
['$injector', function(a) {..}]
参数a
将映射到$injector
个实例,如果我们有
['$injector', '$scope', function(a, b) {..}]
a
将映射到$injector
个实例,而b
将映射到$scope
个实例。这里的顺序很重要。更多信息如下:{关于缩小的注意事项部分中的https://docs.angularjs.org/tutorial/step_05。
如果我不在数组中发送$ injector,那么什么是行不通的?
如果你不这样做,$ injector将是未定义的,其中一些就是上面解释的。
此指令又如何嵌入控制器?你什么时候定义这样的控制器?
如果需要,某些指令可以有控制器,它们应该包含一些较重的逻辑,$ scope绑定等等。 link 函数实际上应该只保存与$ element的交互。 更多信息:http://www.sitepoint.com/practical-guide-angularjs-directives/
此外,我通常会在下面的代码中看到带有$前缀的范围,如果没有$?
,它是如何工作的
在这种情况下,scope
用于链接功能,它不是一个可注意的。在这种情况下,它是一个简单的变量scope
,它指的是控制器范围。您可以将其称为superBigVariableName
,它仍然会引用范围并仍然有效。
所以请记住,链接函数实际上是一个简单的函数,其中第一个属性是范围,第二个是元素,第三个是属性,您不能将服务注入链接函数(在控制器中执行该逻辑)