使用控制器而不是链接将父控制器范围转换为指令

时间:2016-09-20 12:02:45

标签: angularjs angular-directive angular-controller

我正在使用' LocalCtrl'控制器用于指令所需的所有功能,但是如何将指令的范围从指令和范围从指令返回到控制器。

我的指令嵌入在父控制器中。我知道如何使用链接函数并隔离范围,以便在指令和控制器之间进行双向绑定。我不确定如何使用以下结构继承父作用域。

function check_user_role( $atts, $content = null ) {
        extract( shortcode_atts( array(
                'role' => 'role' ), $atts ) );

        $user = wp_get_current_user();
        $roles = explode(',', $user);
        $allowed_roles = array($roles);
        if( array_intersect($allowed_roles, $user->roles ) ) {
                return $content;
        }
}
add_shortcode( 'user_role', 'check_user_role' );

1 个答案:

答案 0 :(得分:1)

Angularjs中的指令有3个范围,如下所述

参考In which cases angular directive scope equals controller scope?

1。默认情况下,范围为false,这意味着更改指令中的范围变量也会更改父范围变量,因为它不会创建新范围。

 app.directive('mydirective',function () {
        return{
            controller:'LocalCtrl as local',
            templateUrl: '<div>{{local.content}}</div>',
        }
    });
  1. scope:true,这将在子指令中创建一个新的子范围,它从父范围或父控制器范围原型继承

    app.directive('mydirective',function () {
        return{
            scope:true,
            controller:'LocalCtrl as local',
            templateUrl: '<div>{{local.content}}</div>',
        }
    });
    
  2. 3:scope:{}:隔离范围,它不会从父范围继承(可以创建可重用的组件/指令)

    查看

       <div ng-controller = "mainCtrl ">
          <my-directive content="mainContent" some-fn="someFn"></my-directive>
      </div>   
    
    
        app.directive('mydirective',function () {
            return{
                scope:{
                   twoWayConent:'=content',// two way data binding
                   oneWayConent:'@conent', // one way binding
                   someFn:'&someFn' //function binding ( 2 way)
                 },
                controller:'LocalCtrl as local',
                templateUrl: '<div>{{local.content}}</div>',
            }
        });
    

    4。 using require::如果在另一个指令中有一个指令,则可以使用In Directive Defination对象(DDO)require来访问子指令中的父指令控制器变量和功能,如下所示

    查看

     <parent-directive>
           <child-directive></child-directive>
    </parent-directive>
    
    
    
     app.directive('childDirective',function () {
        return{
            require:'^parentDirective' // can be array of parents directive too
            link:function(scope,element,attrs,parentDirectiveController){
                   console.log(parentDirectiveController) // can access parent directive controllers instances
            }
        }
    });