AngularJs ng显示和自定义指令

AngularJs ng显示和自定义指令,angularjs,Angularjs,我有一个调整元素宽度的指令。它被称为伸缩柱。这在我的整个应用程序中一直有效。 它的工作方式是查看指令的子项并计算每个子项的高度。如果高度大于视口,则会增加指令的宽度 我遇到了ng show的问题。通常我使用ng if,但在这种情况下,我需要使用ng show。 这样做的问题是,我的指令计算子元素的高度(因为元素是隐藏的,所以为0),而不更改宽度 当ng show为true时,将显示内容,但我的指令不会再次触发,因为只显示if。所以,我的问题是: 我是否可以覆盖ng show指令来触发指令代码或

我有一个调整元素宽度的指令。它被称为伸缩柱。这在我的整个应用程序中一直有效。 它的工作方式是查看指令的子项并计算每个子项的高度。如果高度大于视口,则会增加指令的宽度

我遇到了
ng show
的问题。通常我使用
ng if
,但在这种情况下,我需要使用
ng show
。 这样做的问题是,我的指令计算子元素的高度(因为元素是隐藏的,所以为0),而不更改宽度

ng show
为true时,将显示内容,但我的指令不会再次触发,因为只显示if。所以,我的问题是:

  • 我是否可以覆盖
    ng show
    指令来触发指令代码或
  • ng show
    为真时,是否有方法触发我的指令

您有很多不同的选择,但这里有几个:

  • 您可以修改指令,以侦听您在示波器上广播的事件,无论哪个控制器将
    ng show
    表达式中的条件从false更改为true,然后在该点重新运行测量代码

  • 您可以在指令的
    链接
    功能中检查是否设置了
    ng show
    属性,如果设置了属性,则在表达式上设置一个手表,当表达式从
    false
    更改为
    true
    时,该手表将重新测量。如果您只可能遇到
    ng show
    的问题,我更喜欢这种方法,因为它不需要更改任何其他代码

  • #2的代码非常简单:

    function postLink (scope, element, attributes, controller) {
      if (attributes.ngShow) {
        scope.$watch(attributes.ngShow, (newVal, oldVal) {
          if (newVal && !oldVal) {
            controller.measure();
          }  
        }
      } else { 
        // note this is in an else to prevent measure firing twice
        // if ngShow is set and it's initially true.
        controller.measure();
      }
    }