Angularjs 多个角度控制器中的onsen navigator后推事件侦听器
假设我有3个控制器,每个控制器与不同的Angularjs 多个角度控制器中的onsen navigator后推事件侦听器,angularjs,onsen-ui,Angularjs,Onsen Ui,假设我有3个控制器,每个控制器与不同的关联: C1(v1.html),C2(v2.html),C3(v3.html) 我从v1.html向v2.html发射nav.pushPage(),然后从那里发射到v3.html。我正在尝试使用postpush事件侦听器初始化C2和C3的作用域变量 现在,我感到困惑的是nav.on('postpush')事件侦听器的位置。如果我把它同时放在C2和C3中,那么在移动到v3.html时,C2和C3事件侦听器都会被触发。在浏览了一些文档和问题之后,这似乎是预期
关联:
,C1(v1.html)
,C2(v2.html)
C3(v3.html)
v1.html
向v2.html
发射nav.pushPage()
,然后从那里发射到v3.html
。我正在尝试使用postpush
事件侦听器初始化C2
和C3
的作用域变量
现在,我感到困惑的是nav.on('postpush')
事件侦听器的位置。如果我把它同时放在C2
和C3
中,那么在移动到v3.html
时,C2
和C3
事件侦听器都会被触发。在浏览了一些文档和问题之后,这似乎是预期的行为。但是我应该担心吗
我尝试在所有控制器中使用nav.off('postpush')
方法在$scope.$on('$destroy')
上禁用事件,但它似乎不起作用,因为v1.html
上的pushPage()
不会破坏C1的
作用域。这方面的工作是什么?我应该在哪里禁用侦听器
让我知道这是否需要代码片段,因为以上所有内容都与onsen API相关,这应该是可以理解的。
postpush
AngularJS中的事件侦听器应设置为具有导航器和其他组件具有的ons postpush
属性:
它接受导航器范围内的函数,并将其用作侦听器。这样,它将只设置一次,因此不必担心许多侦听器同时被解雇
在该侦听器中,您可以设置动画结束时的变量或任何需要的变量,然后从ons页面
控制器访问这些变量。您的ons页面
控制器很可能是navigator控制器的子控制器,因此您可以从它们那里使用$parent
。您还可以触发子事件并从页面控制器捕获它们,或者简单地使用服务共享您需要的任何内容
事件是在链接页面元素之后触发的,因此我相信控制器将在触发事件之前初始化。您可以使用前面提到的方法在需要时“触发”初始化(服务、父控制器或子事件)
也许onTransitionEnd
回调对您也很有用:
希望有帮助 如果我理解正确,问题是您无法在C2中区分
postpush
C1->C2和C2->C3?在这种情况下,postpush
事件具有“enterPage”和“leavePage”属性,这两个属性非常有用。@FranDios是的,我现在正在使用这两个属性。但是假设我在两个视图中绑定了控制器C2
。因此,该控制器将创建两次,从而两次注册postpush
侦听器。因此,当我从v2
推到v3
时,C2
范围不会被破坏。然后从v3
推送到v4(C2)
再次注册C2
范围。我们现在注册了两个侦听器。如何取消上一个?@FranDios我无法在范围已销毁的情况下执行此操作,因为v2
页面范围仍处于活动状态。应在导航器的范围内使用ons postpush
属性设置postpush
。在这种情况下,即使您在navigator中更改页面,侦听器也只会注册一次。如果要在动画完成时初始化内容,可以在导航器的控制器中的postpush
上设置一个布尔值,然后根据该布尔值(即ng If=“$parent.isAnimationFinished”
)或类似值初始化页面控制器上的值。@FranDios Ok。将查看ons postpush
属性。我不知道那件事。。顺便说一句,你能写一个问题的答案吗?使用onTransitionEnd
和postpush
监听器有什么区别?它们可以互换使用吗?我现在正在使用onTransitionEnd
方法,在服务中为下一个要使用的页面设置一些值。但正如您所说,下一个控制器在执行onTransitionEnd
方法之前初始化,因此它看不到将要进行的更改onTransitionEnd
。我可以用prepush
event listener做这件事。但这将使我在与我的导航器关联的单个控制器中编写所有代码。在转移到另一个控制器之前,这里还有其他方法调用当前控制器的方法吗?非常感谢@FranDios的回答。这对我帮助很大。我的应用程序在按照您的建议重构后看起来更干净了。正在接近onsen:)