Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问AngularJS隔离作用域的替代方法_Javascript_Angularjs - Fatal编程技术网

Javascript 访问AngularJS隔离作用域的替代方法

Javascript 访问AngularJS隔离作用域的替代方法,javascript,angularjs,Javascript,Angularjs,AngularJS隔离作用域是在angular指令中创建可重用组件的好方法。我非常喜欢它。有时需要访问子作用域来操作数据或调用方法。要做到这一点,我们有两个选择 (1) 将隔离作用域与属性绑定一起使用。像 scope: { someObject: '=' }, (2) 来自DOM元素的scope()。$$childHead。Angular official doc不保证$$childHead将提供实际的子范围。有时有效,有时无效 scope().$$childHead 第一个选项的问

AngularJS隔离作用域是在angular指令中创建可重用组件的好方法。我非常喜欢它。有时需要访问子作用域来操作数据或调用方法。要做到这一点,我们有两个选择

(1) 将隔离作用域与属性绑定一起使用。像

scope: {
    someObject: '='
},
(2) 来自DOM元素的scope()。$$childHead。Angular official doc不保证$$childHead将提供实际的子范围。有时有效,有时无效

scope().$$childHead
第一个选项的问题是,它给了我们只处理绑定对象/数据的选项,而没有给我们范围的完全访问权。也许这正是Angular想要做的,但我想通过它的隔离特性获得对隔离作用域的完全访问。为了做到这一点,我创建了以下代码(在指令链接函数中,我使用了新的链接控制(函数(范围、元素、属性)){…}):

用法:

父控制器

app.controller('MainController', ['$scope', function($scope){
    var parentData = [1, 2, 3, 4];
    var anotherValue1 = LinkController.get('td01').attr.anotherValue || 'default value';
    var anotherValue3 = LinkController.get('td03').attr.anotherValue || 'default value';

    LinkController.get('td01').scope.data = parentData;
    LinkController.get('td02').scope.showNext();
    LinkController.get('td03').element.css({opacity: '.5'});
}]);
<test-directive scope-id="td01" any-attr="hello world" />
<test-directive scope-id="td02" any-attr="foo bar" />
<test-directive scope-id="td03" any-attr="alibaba" another-value="test value" />
HTML

app.controller('MainController', ['$scope', function($scope){
    var parentData = [1, 2, 3, 4];
    var anotherValue1 = LinkController.get('td01').attr.anotherValue || 'default value';
    var anotherValue3 = LinkController.get('td03').attr.anotherValue || 'default value';

    LinkController.get('td01').scope.data = parentData;
    LinkController.get('td02').scope.showNext();
    LinkController.get('td03').element.css({opacity: '.5'});
}]);
<test-directive scope-id="td01" any-attr="hello world" />
<test-directive scope-id="td02" any-attr="foo bar" />
<test-directive scope-id="td03" any-attr="alibaba" another-value="test value" />
它是内存安全的,因为它正确地释放了作用域的指针


请让我知道您的真实意见,或者建议更好的方法。

我认为一个孤立的范围的意义在于将范围与其他内容分开,将关注点分开。您应该通过提供绑定到控制器或通过事件系统的对象来真正实现指令的接口。换句话说,控制器不应该知道任何关于指令内部的明确信息


我想不出一个好的理由让您需要从控制器访问整个指令范围。

您想做什么?什么不起作用?除了以下几点外,没有什么不对的:1。我对AngularJS和2不熟悉。我想要独立作用域的完全访问权限。这就是为什么我要用LinkController类。我只需要知道我是否走错了方向。这个概念毫无意义。使用像
scope().$$childHead
这样的东西是非常不寻常的。在你对如何工作的基本理解中似乎缺少了一些东西,如果它根本不是“孤立的”,那么称它为“孤立的”范围有什么意义呢?您可以为该指令维护一个独立的作用域,也可以不维护,但从父级继承。两者之间什么都没有。请参阅关于的这一伟大页面。感谢这些资源。因为我想写更少的代码,所以消除了父级和子级之间的绑定。然后,让我们把它看作第四种类型的指令作用域,它可以选择带有公共getter的隔离作用域。我建议写一个新问题,概述通过使作用域可访问来实现的目标。我相信在坚持模块化原则的同时,有一种很好的简洁方法可以得到你想要的结果。@Matt我理解你的观点。我的解决方案很有效。但是我把它贴在这里是为了吸引像你这样伟大的角度专家的目光。根据您在这里的评论,我可能会删除我的解决方案,并开始使用标准的角度方式:)