Javascript AngularJS:从控制器访问特定指令范围

Javascript AngularJS:从控制器访问特定指令范围,javascript,jquery,angularjs,angularjs-directive,Javascript,Jquery,Angularjs,Angularjs Directive,我是个新手,所以如果我遗漏了什么或者误解了文档,请原谅我 我有一个指令,它将元素转换为jquery插件 .directive('myDir', function($compile) { return { link: function(scope, element, attributes) { // $('.someDiv').jqueryPlugin(...); element.jqueryPlugin();

我是个新手,所以如果我遗漏了什么或者误解了文档,请原谅我

我有一个指令,它将元素转换为jquery插件

.directive('myDir', function($compile) {
    return {
        link: function(scope, element, attributes) {
            // $('.someDiv').jqueryPlugin(...);
            element.jqueryPlugin();
            var el = $compile("<span translate>{{ 'label' }}</span>")(scope);
            element.find('.label').html(el);
        }
    }
})
将更改所有标签

有没有办法实现这个目标?或者我应该回顾解决问题的方法

提前谢谢

编辑

我还将有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对象上使用我的dir属性,但没有效果。

有多种方法可以解决这个问题,这里有几种方法。根据需要,您可以将隔离作用域指令(
作用域:{}
)与双向(
=
)一起使用。您还可以使用
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("<span translate>{{ 'label' }}</span>")(scope);
            element.find('.label').html(el);
        }
    }
});
然后你可以做:

<div ng-repeat="item in labels" my-dir="item.label"></div>


PSL,为什么要在此处使用=而不是&?似乎这设置了一个不必要的手表。@JoeEnzminger我不喜欢对显式绑定属性使用/hacking函数绑定(&)的想法。另请注意
假设它包含一些应该是动态的字符串
,如果您真的想要一次性绑定,您也可以使用
@
,但这似乎不是OP的目的。请记住
在1.3+中绑定,移除不需要的手表并不是一个真正需要用另一个目的实现IMHO来解决的问题。那么为什么你要使用
=
@
,因为这比使用
&
更适合我。我不认为这是正确的(或者这是一种黑客行为)。@绑定力插值-这意味着值将始终是字符串(不能使用@绑定到对象)在指令作用域值上创建一个隐式监视,该值修改相应的父作用域表达式(如果它是可赋值的)。&创建一个单向绑定-防止指令修改父范围-我认为它在这里更合适。就像其他手表一样(这就是为什么我喜欢最小化手表:),使用::label会丢失动态属性。我认为@确实是正确的方法。只是吹毛求疵。我同意您引用的文本-它们非常适合将回调函数绑定到指令,但这并不是它们的全部理想用途。它们对于删除不必要的监视以及将指令与父作用域隔离非常有用;)@JoeEnzminger是的,正如我前面所说的,比使用
&
更好的方法,因为它可以打开另一个防淹门(我曾经有过这样的经验,在没有目的地使用时被误用:()…不过总体上讨论得很好:)Thx!!
toBePlugined = $('div.tbp');

facade.createPlugin(toBePlugined, 'label');
facade.changeLabel(toBePlugined, 'label2');
.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("<span translate>{{ 'label' }}</span>")(scope);
            element.find('.label').html(el);
        }
    }
});
 $scope.labels = [{label:'label1'}, {label:'label2'}, {label:'label3'}]
<div ng-repeat="item in labels" my-dir="item.label"></div>