Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在同级指令之间共享作用域变量_Angularjs_Angularjs Directive_Coffeescript_Angularjs Scope - Fatal编程技术网

Angularjs 在同级指令之间共享作用域变量

Angularjs 在同级指令之间共享作用域变量,angularjs,angularjs-directive,coffeescript,angularjs-scope,Angularjs,Angularjs Directive,Coffeescript,Angularjs Scope,我正在处理一个可以通过单击标题栏展开/折叠的表。为了实现这一点,我有两个在标记中显示为同级的指令:slideToggle和slideable。我想在两个指令之间共享一个包含打开/关闭状态的变量。我创建了一个父指令slideContainer作为API,因为据我所知,同级指令不能单独共享控制器实例。我希望通过向slideContainer元素添加属性,可以在标记中设置状态。变量应该可以从所有三个指令中访问、保持最新和可变,并且DOM应该可以访问双向绑定,因为视图的一部分将取决于状态。起初,我想我会

我正在处理一个可以通过单击标题栏展开/折叠的表。为了实现这一点,我有两个在标记中显示为同级的指令:slideToggle和slideable。我想在两个指令之间共享一个包含打开/关闭状态的变量。我创建了一个父指令slideContainer作为API,因为据我所知,同级指令不能单独共享控制器实例。我希望通过向slideContainer元素添加属性,可以在标记中设置状态。变量应该可以从所有三个指令中访问、保持最新和可变,并且DOM应该可以访问双向绑定,因为视图的一部分将取决于状态。起初,我想我会在这里发布文章,以了解实现这一目标的“最佳”方法,但我已经尝试了许多方法,但都无法完全实现。这就是我现在的处境:

可滑动。咖啡:

directives.directive "slideContainer", () ->
  link: (scope, element, attrs) ->
    scope.closed = "closed" in attrs
  controller: ($scope) ->
    this.closed = $scope.closed

directives.directive "slideToggle", () ->
  scope: {}
  require: "^slideContainer"
  link: (scope, element, attrs, slideContainerCtrl) ->
    scope.closed = slideContainerCtrl.closed

    target = null
    content = null

    element.bind "click", () ->
      target = document.querySelector(attrs.slideToggle) if (!target)
      content = target.querySelector(".slideable_content") if (!content)

      if slideContainerCtrl.closed
        target.style.maxHeight = content.clientHeight + "px"
      else
        target.style.maxHeight = "0px"

      slideContainerCtrl.closed = !slideContainerCtrl.closed

directives.directive "slideable", () ->
  scope: {}
  restrict: "C"
  require: "^slideContainer"
  compile: (element, attr) ->
    contents = element.html()
    element.html("<div class='slideable_content'>#{contents}</div>")

    (scope, element, attrs, slideContainerCtrl) ->
      transProp = attrs.transProp || "max-height"
      transTimeFunc = attrs.transTimeFun || "linear"
      transDur = attrs.transDur || "0.5s"
      maxHeight = if slideContainerCtrl.closed "0" else "1000px"

      element.css({
          "overflow": "hidden",
          "max-height": maxHeight,
          "transition": "#{transProp} #{transTimeFunc} #{transDur}",
          "width": "100%"
      })

您尝试过使用服务吗?我认为服务不起作用,因为它是一个单实例,多个表需要独立使用此设置。我必须为每个表创建一个服务,这似乎不是一个好方法。如果我正确理解您的问题。您希望将这三个指令作为一个集合,稍后您将拥有这三个指令的多个独立集合。如果是这样,您可以在每个指令中保留一个变量。并使用$broadcast、$emit和$on更新每个指令中的变量。可能不是最好的方法,但应该能够解决您的问题。这有意义吗?或者你可以把三个指令合并成一个。
<div slideContainer closed>
  <!-- initial state determined by presence of closed attr above -->
  <div slideToggle>
    <img ng-if="closed" src="closed.jpg">
    <img ng-if="!closed" src="open.jpg">
    <!-- TABLE TITLE -->
  </div>
  <table class="=open-ended-in-process-table slideable">
    <thead>
      <tr>
        <!-- COLUMN TITLES -->
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="thing in list">
        <!-- TABLE DATA -->
      </tr>
    </tbody>
  </table>
</div>