【问题标题】:UI-Router StateChange but view UI doesn't refreshUI-Router StateChange 但视图 UI 不刷新
【发布时间】:2014-11-24 18:35:39
【问题描述】:

我正在使用 UI-Router 加载带有新表单的视图,或编辑现有表单。

新表单的 url 为:#/dashboard/form/someFormType

可编辑表单的 url 为:#/dashboard/form/someFormType/edit/instanceid

路由状态的设置如下所示,抽象状态解析两个子状态使用的条目,然后解析自己的条目。

.state('dashboard.form', {
    url: "/form/:formType",
    abstract: true,
    controller: 'FormController',
    controllerAs: 'formCtrl',
    templateUrl: '/app/dashboard/views/form.html',
    resolve: { ... }
})

.state('dashboard.form.create', {
    url: "",
    resolve: { ... }
})

.state('dashboard.form.edit', {
    url: "/edit/:formPackageInstanceId",
    resolve: { ... }
})

如果我开始在dashboard.edit.form 中编辑现有表单,然后决定在中途创建一个新表单并单击具有dashboard.form 的ui-sref 的导航栏。从仪表板创建url 更改。 form.edit 到dashboard.form.create,dashboard.form.create 中的resolves 已经解决了,但是UI 从不刷新,所以表单输入值是我之前编辑的表单的值...

有什么建议吗?

更新

在一些帮助下,我找到了一些记录路由问题的代码:

// Add state change hooks to log issues to console
.run(function($rootScope, $state, $urlMatcherFactory) {
    $rootScope.$state = $state;
    function message(to, toP, from, fromP) { return from.name  + angular.toJson(fromP) + " -> " + to.name + angular.toJson(toP); }
    $rootScope.$on("$stateChangeStart", function(evt, to, toP, from, fromP) { console.log("Start:   " + message(to, toP, from, fromP)); });
    $rootScope.$on("$stateChangeSuccess", function(evt, to, toP, from, fromP) { console.log("Success: " + message(to, toP, from, fromP)); });
    $rootScope.$on("$stateChangeError", function(evt, to, toP, from, fromP, err) { console.log("Error:   " + message(to, toP, from, fromP), err); });
});

它没有通过任何错误,并记录状态更改的开始和成功完成:

Start:   dashboard.form.edit{"formPackageType":"corporation","formPackageInstanceId":"574"} -> dashboard.form.create{"formPackageType":"corporation"}
Success: dashboard.form.edit{"formPackageType":"corporation","formPackageInstanceId":"574"} -> dashboard.form.create{"formPackageType":"corporation"} 

【问题讨论】:

  • 在使用 UI-Router 调试问题时,我发现为 UI-Router 调度的“$stateChangeError”事件添加侦听器非常有用。查看this documentation页面底部的操作方法。
  • 在转换或解决过程中可能出现一些错误。有时在这种情况下不会给出错误消息。您可以尝试@SunilD 之类的$stateChangeError 事件。州。
  • 嗨@SunilD。我使用您的建议更新了我的代码,但它似乎没有出现错误,并且解决了,但没有刷新 UI

标签: javascript angularjs angular-ui-router


【解决方案1】:

您的表单模板位于父状态。当您从一个子状态转到另一个子状态时,它们的父状态不会重新加载(或者,更准确地说,当您从一个状态到另一个状态时,它们的共同祖先都不会重新加载)。

但是,这并不意味着您无法清除子状态更改的表单。您可以执行以下操作之一:

  1. 将模板移至子状态,使其在每次状态更改时完全重新构建。注意在父状态中使用“普通容器”模板(),以便子状态模板有一个可以渲染的地方。
  2. 将您的数据放入父范围。子状态可以访问它,因此您可以手动编辑子状态控制器构造的数据。 (注意不要overwrite parent scope properties。)

(我已经编辑了答案以包含下面讨论的要点。)

【讨论】:

  • 嗨@hon2a 我明白你在第一段中所说的话,这是有道理的。我想也许如果这是真的,我可以将 templateUrl 移动到每个单独的子状态中,以使它们分别重新加载,并将其移出父级,但之后页面没有加载,我不明白。我不明白你的第二段,我如何从孩子访问父母的父母范围?或者我猜更具体地说在哪里?在子控制器中?
  • 如果将模板移动到两个子状态,则需要在父状态下使用“普通容器”模板(<div ui-view></div>),这样子状态模板才有位置被渲染成。
  • 子状态范围是超状态范围的后代,因此您可以从子状态控制器访问超状态范围属性。 (注意不要overwrite super-state properties。)
  • 感谢@hon2a,我最终添加了一个普通容器,效果很好。我只是在阅读链接,谢谢。您应该发布这些作为答案。干杯
  • 好的,我会将信息添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多