Javascript Can';t从指令访问控制器范围
这是我的应用程序配置:Javascript Can';t从指令访问控制器范围,javascript,angularjs,Javascript,Angularjs,这是我的应用程序配置: angular.module('myApp', ['myApp.directives', 'myApp.controllers', 'myApp.services']); 这是我的控制器: angular.module('myApp.controllers', []) .controller('MainCtrl', function ($scope) { $scope.name = 'world'; }); 这是我的指示: var directiv
angular.module('myApp', ['myApp.directives', 'myApp.controllers', 'myApp.services']);
这是我的控制器:
angular.module('myApp.controllers', [])
.controller('MainCtrl', function ($scope) {
$scope.name = 'world';
});
这是我的指示:
var directives = angular.module('myApp.directives', []);
directives.directive("hello", function () {
return function (scope, elm, attrs) {
elm.text("hello, " + scope[attrs.name]);
};
});
scope.$parent.name
这是我的html:
<div ng-controller="MainCtrl">
<h1 hello></h1>
</div>
问题在于,angular将指令渲染为:
你好,未定义
而不是:
你好,世界
怎么了?您正在访问
范围[attrs.name]
,但指令没有为属性名称提供值
有两种选择:
将指令更改为elm.text(“hello,”+scope['name'])代码>
这不是首选方法,因为它会硬编码到范围属性名称
将html更改为
。这更好,但我觉得它使用了冗余属性
我建议您将指令更改为elm.text(“hello,”+scope[attrs['hello'])代码>
或者更好的elm.text(“hello,+scope.$eval(attrs['hello'])代码>
这样,您也可以从表达式中获益(例如:
)
这样,html将是
关于attrs参数:它只不过是从dom元素上的属性中提取的字符串的映射。您可以使用范围访问它。看
在撰写本文时,您可以做一些在Angular中似乎没有记录的事情(请参见Mark Rajcok的评论:)
在您的指令范围内:
var directives = angular.module('myApp.directives', []);
directives.directive("hello", function () {
return function (scope, elm, attrs) {
elm.text("hello, " + scope[attrs.name]);
};
});
scope.$parent.name
如果在指令的范围
(从指令中)上执行控制台.log(范围)
,您将看到这些属性
综上所述,我不知道这是否是“正确的”角度约定,因为这两者都是未记录的,而且我还没有找到其他更好的关于如何访问指令所在控制器的文档。我发现了另一种情况:
如果要访问来自Ajax请求主体的变量,则必须等待变量设置完成
e、 g:
这真的很有趣,谢谢!我发现很少有关于使用点语法的文档。这确实是错误的,传递给链接函数的scope
对象与控制器实例化的$scope
对象不同,它是对指令实例化的作用域的只读引用,应该用scope
表示。谁说它是相同的?您不可能仅仅通过编写$scope来访问$scope。这违反了公约。将$放在作用域之前并不意味着它是控制器的作用域对象。@vcardillo很好地添加plunker或问一个问题:)调试后,我意识到我的问题是我在指令定义对象中使用了scope:{…}
attribtue,从而创建了一个新的隔离作用域。我在阻止原型遗传。