angularjs有一个仅适用于选择控制器的指令

angularjs有一个仅适用于选择控制器的指令,angularjs,Angularjs,我正在使用一个指令实现从a到div的页面滚动。这意味着通过点击a看起来像: <a data-scroll-on-click="" href="#projects">Projects</a> preventDefault停止路由器启动 带有点击数据滚动的属性的a是导航栏的一部分,我想通过ng include将其包含在其他页面上。但是,这意味着a元素将在滚动没有意义的页面上具有滚动单击属性。这意味着,当导航栏位于主页之外的其他页面上时,我希望其中的锚能够像链接一样返回主页,

我正在使用一个指令实现从
a
div
的页面滚动。这意味着通过点击
a
看起来像:

<a data-scroll-on-click="" href="#projects">Projects</a>
preventDefault
停止路由器启动

带有点击数据滚动的
属性的
a
是导航栏的一部分,我想通过
ng include
将其包含在其他页面上。但是,这意味着
a
元素将在滚动没有意义的页面上具有
滚动单击
属性。这意味着,当导航栏位于主页之外的其他页面上时,我希望其中的锚能够像链接一样返回主页,而不是触发滚动

我不确定什么是好的解决方案:我不确定是否有可能只有在存在某个活动控制器(一种条件属性)的情况下才会出现
滚动单击
?或者如果可以在指令中指示当前活动控制器


最坏的情况是,我只写两个导航条-一个用于通过指令实现滚动的主页,另一个用于通过路由器实现链接的辅助页面,但我觉得有一种更简洁的方法可以做到这一点。

我认为您可以在单击“真/假”时将布尔值与数据滚动一起传递给并在指令中检查它是否为真,而不是继续滚动,否则忽略它

<a data-scroll-on-click="" href="#projects">Projects</a>

在您的代码中,将在第一次链接指令时计算所需的
滚动\u
。这意味着,每当用户导航离开主页面(主页面中加载的给定页面)时,指令都是无用的-它已经用
scroll\u needed=true
初始化。最好检查一下attrs.scrollOnClick
inside click handler来检查应用程序的当前状态。我还没有尝试过,如果这样做了,你的建议很好,如果有一个可用的plinker或jsfiddle,你可以修改。如果答案正确,请投票,如果需要进一步修改,请修改它。
consortiumApp.directive('scrollOnClick', function() {
    return {
      restrict: 'A',
      link: function(scope, element, attrs) {
        var idToScroll = attrs.href;
        element.on('click', function(event) {
          event.preventDefault();
          var $target;
          if (idToScroll) {
            $target = $(idToScroll);
          } else {
            $target = element;
          }
          $("body").animate({scrollTop: $target.offset().top}, 1500, 'easeInOut
        });
      }
    }
  });
<a data-scroll-on-click="" href="#projects">Projects</a>
consortiumApp.directive('scrollOnClick', function() {
return {
  restrict: 'A',
  link: function(scope, element, attrs) {
    var idToScroll = attrs.href;
    var scroll_needed = attrs.scrollOnClick;
    if(scroll_needed === true){
      element.on('click', function(event) {
        event.preventDefault();
        var $target;
        if (idToScroll) {
          $target = $(idToScroll);
        } else {
          $target = element;
        }
        $("body").animate({scrollTop: $target.offset().top}, 1500, 'easeInOut
      });
    }
   } 
  }
});