首页 > 解决方案 > 离子标签点击与 $state.go

问题描述

如果用户启动应用程序并单击搜索选项卡,他们将被路由到页面并且一切正常 - 父页面已加载,被缓存,用户可以导航到子搜索详细信息并再次返回父搜索页面而没有问题.

但是,如果用户使用外部 QR 码启动应用程序,该应用程序的深层链接会被检测到,并且用户会使用 自动路由到搜索页面$state.go('/tab/search'),该链接会提供 ID 进行查找,如果找到,则自动将用户路由到搜索详细信息页面。

这也有效....除了当用户单击后退按钮(或search再次单击选项卡按钮)时,父视图未缓存,元素丢失,视图尝试再次刷新自身。这一切都搞砸了。我花了很长时间才弄清楚为什么会发生这种情况。

问题#1:标签点击和路由到页面之间有什么区别$state.go()??

问题 #2:我该如何解决这个问题...在应用程序进入时,我是否应该使用 $state.go 以外的东西将用户转换到搜索页面?...触发或模拟选项卡按钮单击的东西,所以ui-router 是否能够正确跟踪页面状态?

  .state('tab', {
    url: "/tab",
    abstract: true,
    templateUrl: "templates/tabs.html",
    controller: 'TabsCtrl'
  })
  
  .state('tab.home', {
    cache: true,
    url: '/home',
    params: tabParams,
    views: {
      'tab-home': {
        templateUrl: 'templates/tab-home.html',
        controller: 'HomeCtrl'
      }
    }
  })
  
  .state('tab.search', {
    cache: true,
    url: '/search',
    params: tabParams,
    views: {
      'tab-search': {
        templateUrl: 'templates/tab-search.html',
        controller: 'SearchCtrl'     
      }
    }
  })
  .state('tab.search-detail', {
    cache: false,
    url: '/search/:ceID',
    params: tabParams,
    views: {
      'tab-search': {
        templateUrl: 'templates/detail-search.html',
        controller: 'SearchDetailCtrl'
      }
    }
  })  

在 app.js 文件中,这是检测应用程序是否使用外部链接(即:二维码)打开的函数:

window.handleOpenURL = function(url) {
  setTimeout(_ => {
    var parsed = new URL(url); 
    var search = parsed.search.substring(1);
    urlObj = JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g,'":"') + '"}', function(key, value) { return key===""?value:decodeURIComponent(value) }) ;
    if (parsed.pathname == "//r" || parsed.pathname == "/r" || parsed.hostname == "r") {
      console.log("External Link Detected") ;
      extLink = 1 ;
      $state.go("/tab/search",{"prodID":urlObj.id,"type":"r","qrVer":null} ;) ;
    }
  }) ;
}
   

标签: angularjsionic-frameworkangular-ui-router

解决方案


推荐阅读