AngularJS:从控制器访问特定的指令范围
我是棱角分明的新人,如果我错过了什么或者误解了文档,请原谅我。
我有一个指令,它将元素转换为jquery插件
.directive('myDir', function($compile) { return { link: function(scope, element, attributes) { // $('.someDiv').jqueryPlugin(...); element.jqueryPlugin(); var el = $compile("{{ 'label' }}")(scope); element.find('.label').html(el); } } })
正如你所看到的,首先我在html元素中创建一个jquery插件(它在内部元素中创建它的dom,包括一些带有标签类的div – 假设它包含一些应该是动态的字符串,并且应该是全局可转换的)然后我替换静态jquery生成的标签插入一个。 我应该能够从控制器管理它。
问题是,我可以在一个控制器中有很多指令,比方说
在指令和jquery运行后,它会给出一些东西,比方说,比方说
{{label|translate}} {{label|translate}} {{label|translate}} {{label|translate}}
如何,从控制器,我可以管理一个特定的指令? 如何访问所选范围的范围?
我认为
// controller $scope.label = "some content";
将改变所有标签
有没有办法实现这个目标? 或者我应该检讨问题的解决方法?
提前致谢!
编辑
我还将有dom元素,需要从控制器级别附加指令。 他们也应该从这个层面维持。 所以我的想法是提供一个服务,这将是api的某种外观,可以在jquery-plugin’ed dom元素上工作。
所以我想说我需要一些东西
.provider('facade', function() { this.$get = function($rootScope, $compile) { return { createPlugin: function(domElement, defaultLabel) { domElement.attr('my-dir', defaultLabel); $compile(domElement)($rootScope); }, changeLabel(domElement, newLabel) { // get a scope of myDir for provided dom element scope.label = newLabel; } } }; })
它适用于createPlugin,但不知道如何让changeLabel工作……
门面的最佳用途是来自控制器:
toBePlugined = $('div.tbp'); facade.createPlugin(toBePlugined, 'label'); facade.changeLabel(toBePlugined, 'label2');
为什么我需要服务呢? 因为我希望能够从脚本中的各个位置修改插件元素配置。 可能包括各种div,body标签等。
现在 – 我的问题是通过提供其dom对象引用来访问指令范围。 可能吗? 我试图在dom对象上使用my-dir属性而没有任何效果。
可以有多种方法来解决这个问题,这里有几种方法。 根据您的需要,您可以使用带有2路( =
)的隔离范围指令( scope:{}
)。 您还可以使用scope:true
,即从指令创建子范围(如果使用ng-repeat,您甚至可以使用它而没有范围,因为它已经创建了子范围)。 但与具有自己的合同(隔离范围)的指令相比,这种方法将更不可重用/灵活。
所以你可以将你的指令改为:
.directive('myDir', function($compile) { return { scope:{ label:'=myDir' //Set up 2 way binding }, link: function(scope, element, attributes) { // $('.someDiv').jqueryPlugin(...); element.jqueryPlugin(); var el = $compile("{{ 'label' }}")(scope); element.find('.label').html(el); } } });
并从您的控制器绑定,假设您有一个标签列表。
$scope.labels = [{label:'label1'}, {label:'label2'}, {label:'label3'}]
然后你可以这样做: