Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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
Javascript 如何在作用域中的所有指令就绪后运行事件?_Javascript_Angularjs - Fatal编程技术网

Javascript 如何在作用域中的所有指令就绪后运行事件?

Javascript 如何在作用域中的所有指令就绪后运行事件?,javascript,angularjs,Javascript,Angularjs,我正在使用一个修改DOM的指令,因此必须在调用所有postLink FN之后执行。() 给定某些先决条件(未在URL中编码),我想将焦点设置为页面上的第一个select2元素。这是有问题的,因为在设置焦点之前,select2必须初始化,并且如果没有一些俗气的任意延迟>0,我无法安排将设置焦点的事件广播 # TODO - should we create a directive for tab order instead? app.directive "primaryInput", () ->

我正在使用一个修改DOM的指令,因此必须在调用所有postLink FN之后执行。()

给定某些先决条件(未在URL中编码),我想将焦点设置为页面上的第一个select2元素。这是有问题的,因为在设置焦点之前,select2必须初始化,并且如果没有一些俗气的任意延迟>0,我无法安排将设置焦点的事件广播

# TODO - should we create a directive for tab order instead?
app.directive "primaryInput", () ->
  {
    name: "primaryInput"
    link: (scope, element, attrs) ->
      scope.$on "primaryInput/focus", ->
        element.focus()
  }
我创建了以下指令,它将侦听focus primaryInput/focus事件并设置焦点

# TODO - should we create a directive for tab order instead?
app.directive "primaryInput", () ->
  {
    name: "primaryInput"
    link: (scope, element, attrs) ->
      scope.$on "primaryInput/focus", ->
        element.focus()
  }
更改primaryInput指令优先级不起作用,因为任何优先级都将在计划setTimeout函数之前运行

理想情况下,我希望能够有一个承诺集合,每个延迟指令将其推送到一个堆栈中,然后是一个承诺集合,一旦所有这些承诺都完成,它就会得到解决。我会把我的问题集中在如何最好地实现这一点上,但我已经想到了一个不太好的方法,我想探索更好的方法,并希望避免这种情况

谢谢大家!

更新
在这里描述问题的过程中,我退了一步,想到了一种可以接受的方法来解决我的问题,并将回答我自己的问题,但如果有更好的方法,请留下它。

由于延迟执行的复杂性在处理Select2的指令中,我决定,现在,将这种复杂性隔离开来

我在Select2指令中重写了元素上的focus函数,因此一旦Select2实例可用,focus调用就会转发给它。这样,可以告诉元素在选择2之前聚焦

我的焦点指令:

app.directive "input", ($injector) ->
  primaryMatcher = (e,attrs) ->
    attrs.primary?
  {
    name: "inputFocus"
    restrict: 'E'
    link: (scope, element, attrs) ->
      scope.$on "focus", (e, matcher)->
        if ((matcher || primaryMatcher)(element, attrs))
          console.log("focus", element, attrs)
          element.focus()
  }
app.directive "s2Factor", () ->
  # ...
  {
    name: "s2Factor"
    require: "?ngModel"
    priority: 1
    restrict: "A"
    link: (scope, el, attr, controller) ->
      select2_p = $.Deferred()
      # ...
      setTimeout ->
        el.select2 opts
        select2_p.resolve(el.data("select2"))

      el.focus = () ->
        select2_p.then (select2) ->
          select2.focus()
  }
在我的Select2指令中:

app.directive "input", ($injector) ->
  primaryMatcher = (e,attrs) ->
    attrs.primary?
  {
    name: "inputFocus"
    restrict: 'E'
    link: (scope, element, attrs) ->
      scope.$on "focus", (e, matcher)->
        if ((matcher || primaryMatcher)(element, attrs))
          console.log("focus", element, attrs)
          element.focus()
  }
app.directive "s2Factor", () ->
  # ...
  {
    name: "s2Factor"
    require: "?ngModel"
    priority: 1
    restrict: "A"
    link: (scope, el, attr, controller) ->
      select2_p = $.Deferred()
      # ...
      setTimeout ->
        el.select2 opts
        select2_p.resolve(el.data("select2"))

      el.focus = () ->
        select2_p.then (select2) ->
          select2.focus()
  }

它涉及到实例猴子补丁,但我发现在这种情况下它是可以接受的。

因此,基本上,如果我们知道select2的输入模型已经准备好,我们就可以广播该事件。我说得对吗?我试图简化你的问题我意识到这是一个非常复杂的问题,但我试图不过分具体化。在后退一步并进一步思考之后,我想到了一种更干净的方法。