如何在不调用控制器上的$ onInit的情况下使用ui-router更新路由

肯·邓宁顿

我正在尝试在模式打开时动态更新视图上的URL /状态,以及在第一次显示视图时自动打开模式。我正在使用1.x版本的UI Router和AnguarJS组件。我遇到的问题是在更新状态时$onInit()触发;换句话说,打开模态会导致打开第二个模态。

这是我处理状态更改的方法:

showModal() {
  const modal = this.$uibModal.open({
    component: 'viewModal',
    size: 'lg'
  })
  const resetState = () => {
    console.log('resetting state ...')
    this.$state.go('.', {
      id: this.$state.params.id
    }, {
      inherit: false,
      notify: false,
      reload: false,
      location: 'replace'
    })
  }
  modal.opened.then(() => {
    console.log('opening ...')
    this.$state.go('.', {
      foo: 'bar'
    }, {
      notify: false,
      reload: false,
      location: 'replace'
    })
  })
  // The 'catch' is due to the promise being rejected with 'backdrop click'
  // when clicking on the background, though it doesn't always work, but
  // that's another issue entirely
  modal.closed.then(resetState).catch(resetState)
}

这是相关的$onInit()代码

if (this.$state.params.foo) {
  this.showModal()
}

这是路线的样子

export default function routing ($stateProvider) {
  $stateProvider
    .state({
      name: 'exampleView',
      url: '/example/{id}?foo',
      component: 'exampleComponent'
    })
}

我曾考虑过设置reloadnotifyfalse防止重新加载视图,但事实并非如此。有没有更好的方式来更新状态而不触发$onInit我应该window.location直接使用吗?我希望用户能够在打开模式的情况下加载此视图。我不一定需要历史记录支持,因此在打开/关闭模式时,我愿意删除更新URL,但是如果可能的话,我希望保留它。

肯·邓宁顿

该修复程序最终变得相对简单,但花了一些时间才能找到答案。我更新了路线,使其看起来像这样

export default function routing ($stateProvider) {
  $stateProvider
    .state({
      name: 'exampleView',
      url: '/example/{id}?foo',
      component: 'exampleComponent',
      params: {
        foo: {
          dynamic: true
        }
      }
    })
}

dynamic根据docs参数设置为可以防止对参数的任何更改触发状态更改这类似于reloadOnSearch应用于状态声明的属性,但已弃用该属性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

AngularJS UI路由器抽象状态不调用控制器

如何在不更改路由的情况下将参数从视图传递到控制器

如何在不冻结UI的情况下使用QProcess循环的输出更新UI?

在不调用 recompose 的情况下,如何更新 jetpack 中的特定 ui 组件?

在不使用$ rootScope的情况下使用angular ui路由器阻止stateChange

如何在资源控制器的更新路由中传递 id?

如何在不更改 @Input 引用的情况下使用 OnPush 策略更新 Angular UI?

react-router-dom如何更新路由组件内的父状态

如何使用 React Router 4 单击按钮并导航到带有 URL 参数的新路由

如何在 Laravel 中使用相同的路由调用不同控制器的方法

如何在不将异常标记为已处理的情况下重新路由异常

如何在不在 Flask 中定义新路由的情况下获取单选按钮值?

如何在不重新启动页面的情况下更新导航控制器上一页的信息?

如何在不跳帧的情况下更新 UI

在不使用$ rootScope的情况下使用Angular路由更改控制器时如何更改范围

如何在不调用notifiyItemChanged或DiffUtil的情况下更新/刷新RecyclerView的特定项目?

如何在不调用 setstate 的情况下更新类变量?

如何在不重复控制器名称的情况下编写Rails 4路由命名空间?

如何使用Aura Router的相应方法调用控制器?

调用router.navigate后如何确定新路由?

如何在ASP.NET MVC中不使用Ajax的情况下从View调用控制器的方法?

如何在不重定向到页面的情况下使用Ajax调用json控制器

如何在不更改URL的情况下从控制器调用方法到thymeleaf

如何在使用 UIpageviewcontroller 导航页面时从另一个视图控制器自动更新视图控制器上的标签

如何在不刷新组件的情况下基于API中的数据重新路由-React / Redux

在我的情况下如何正确使用路由表?

AngularJS UI-Router在重新路由期间闪烁

Angular / UI-Router-如何在不刷新所有内容的情况下更新URL?

什么时候更新路由器上的OpenWRT?