【问题标题】:Why is the controller for a view loaded twice?为什么视图的控制器会加载两次?
【发布时间】:2016-07-23 06:06:12
【问题描述】:

请查看this plunk 了解我在下面解释的问题。

当您运行 plunk 时,您会发现有某些选项卡。第一个标签Home 属于home 状态。其余选项卡属于category 状态,每个选项卡由一个类别 ID 标识。

当我当前在Home 选项卡上单击其他选项卡时,CategoriesController 按预期只被调用一次。但是当我从那里单击其他选项卡时,CategoriesController 会被多次调用,一次用于前一个选项卡,两次用于新选择的选项卡。请运行 plunker 并观察浏览器控制台以更好地理解它。

我不知道为什么还要为前一个选项卡调用控制器。任何帮助,将不胜感激。

【问题讨论】:

    标签: angularjs angular-ui-router angular-material


    【解决方案1】:

    不确定多次调用控制器的原因。我正在尝试找出问题所在,但在此之前您可以执行以下操作:

    1. 从状态配置中删除controller: "CategoriesController"
    2. ng-controller="CategoriesController" 添加到ui-view="categories" 元素

    这暂时可以工作,因为只有那个视图 -> 控制器将被调用,它是活动的。

    编辑:

    遇到问题了,您在每个选项卡中都有ui-view="categories",因此n 数量的ui-view 正在为n 数量的选项卡呈现。

    现在实际发生的情况是,为了提供幻灯片动画,Angular 材质也在 DOM 中保持左右选项卡可用。

    因此,当您从主页(即第一个选项卡)单击另一个选项卡时,它工作正常。但是,当您从任何其他选项卡(第一个选项卡除外)开始时,由于需要执行滑动效果,因此相应的左右选项卡也会生效。

    【讨论】:

    • 但这似乎不起作用。我需要点击一个标签两次才能激活它。
    • 为什么要为标签使用状态?为什么不能使用简单指令?
    【解决方案2】:

    您正在更改您的CategoriesController$stateChangeStart $watcher 中的seletedTab 值。但同时您正在使用ui-viewng-if,这需要seletedTab 作为参数。

    假设你目前在标签 0 上,并切换到标签 1。事情是这样发生的:

    1. 首先,你的状态改变开始。在$stateChangeStart观察者中,selectedTab被设置为1。

    2. 标签 0 中的 ui-view 已从 DOM 中删除。

    3. 将tab 1中的ui-view添加到DOM中,但目前$stateParams.catID仍为0。这样就启动了$stateParams.catID = 0的CategoriesController。并且在同时,它将seletedTab 设置为 0。这是之前 Controller 的第一次调用

    4. 标签 1 中的 ui-view 已从 DOM 中删除,标签 0 中的 ui-view 已添加到 DOM。

    5. 然后你的 $state 更改成功。选项卡 0 中的 ui-view 使用 $stateParams.catID = 1 初始化 CategoriesController 并将 seletedTab 设置为 1。这是下一个控制器的第一次调用

    6. 好的,现在选项卡 0 中的 ui-view 被删除,选项卡 1 中的 ui-view 再次添加到 DOM,最后使用 $stateParams.catID = 1 初始化 CategoriesController。不过一切看起来都还不错。 这是下一个控制器的第二次调用

    希望我说清楚了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2021-06-11
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      相关资源
      最近更新 更多