AngularJS我的自定义指令无法访问属性,但其他自定义指令似乎可以

时间:2015-06-15 08:54:56

标签: angularjs angularjs-directive

我有一个自定义指令的以下模板。

    .directive('myDirective', ['$controller',function($controller) {
      return {
            templateUrl: 'client/test.ng.html',
            scope: true,
            controller: ['$scope','$attrs',function($scope,$attrs){
              console.log($attrs)
          }],
          transclude: true,

      }
    }])

该指令的调用如下

    <my-directive view="{{view}}"></my-directive>
    <ion-tab ng-if="platform != 'android'" title="{{label}}"  icon-off="{{off}}" icon-on="{{on}}" href="#/tab/{{view}}"> 
            <my-directive view="{{view}}"></my-directive>
    </ion-tab>

    <ion-tab ng-if="platform == 'android'" title="{{label}}" class="tab-item" href="#/tab/{{view}}">
            <my-directive view="{{view}}"></my-directive>
    </ion-tab>

$attrs.view{{view}},未插入。 <ion-tab>将表达式插值到变量值,显示正确的数据。

这对我来说非常困惑。我已将my-directive放在ion-tab指令的内部和外部,以防万一存在某种范围问题。

访问表达式的值并使用该值依次调用另一个指令的关键是什么?

背景:

我经历这一切的原因是因为

<ion-nav-view name="tab-{{view}}"></ion-nav-view>无效。就像my-directive似乎无法获得```view``的值,但原始未解释的请求。我试图获取值并直接调用此指令。

我似乎能够通过$ scope获得我想要的值。$ parent.view但神秘地设置$ scope.view = $ scope。$ parent.view并在子模板中设置{{view}} DOESNT工作要么!?

更多见解,console.log($ attrs)给出:

  $…t.Attributes {$attr: Object, $$element: jQuery.fn.init[1], view: "{{view}}", class: "pane tab-content", navView: "active"}

然而,当这个扩展时,我们已经

   $$element: jQuery.fn.init[1]
     $$observers: Object
     $attr: Object
     class: "pane tab-content"
     navView: "active"
     view: "dash"
     __proto__: Object

任何帮助表示感谢,谢谢。

3 个答案:

答案 0 :(得分:0)

使用链接功能获取属性值。

.directive('myDirective', ['$controller',function($controller) {
  return {
        templateUrl: 'client/test.ng.html',
        scope: true,
        transclude: true,
        link: function(scope,element,attrs){
          console.log(attrs);
        }
   }
}])

答案 1 :(得分:0)

我在你的指令中看不到任何HTML,所以我删除了transclude:true

.directive('myDirective', function () {
    return {
        templateUrl: 'client/test.ng.html',
        scope: {
            view: '='
        },
        link: function (scope) {
            console.log("view", view);
            scope.$watch("view", function (newView, prevView) {
                console.log("changed view", scope.view, newView, prevView);
            });
        }
    }
})

答案 2 :(得分:0)

这是一个计时问题,它与指令生命周期内发生某些事情以及它经历的几个阶段有关。 在尽可能少的细节中,这些是阶段:

  1. 编译
  2. 实例化控制器
  3. 预联
  4. 后联
  5. 请注意,在预链接阶段的某个时间将值插入值({{...}})会发生(并且它也是一个Angular内置指令)。这意味着:

    一个。在控制器实例化期间,值已解决 湾在后连接阶段,这些值肯定得到了解决 C。根据指令的相对优先级与(深奥的)属性插值指令(具有在100之前)的相对优先级,可以在预链接阶段解析或不解析这些值。

    注意:优先级越高意味着预先链接越早发生。

    http://mvnrepository.com/artifact/io.reactivex/rxjava做一个公平的工作来解释发生的事情(如果你仔细阅读的话)。