角度显示,以模态形式向浏览用户显示内容,但在新页面上为新用户显示内容

马克西姆·麦克奈尔(Maxim McNair)

我正在尝试以模态向已经在我的网站上浏览但在新页面上为新用户显示的用户显示相同的内容(具有相同的url)。

例如,这里的用户在树冠上行驶:

转到https://canopy.co/,然后单击链接。内容以模态加载,其URL更新为https://canopy.co/products/12309。但是,直接转到https://canopy.co/products/12309,它以自己的视图加载它,没有模态。

我该如何用angular做到这一点?我用ui-router和多个视图尝试了很多东西,但是最终被渲染了两次。

谢谢你的帮助。

埃德·辛奇利夫(Ed Hinchliffe)

可能有几种方法可以做到这一点。这是我的。

大纲

当状态发生变化时,我们要检查是否可以在当前视图中的模式内提供内容,而不是完全替换当前视图。我们将在路由配置中对此进行定义-可以托管模式的视图将带有modalMaster标志,而可以在模式中显示的视图将带有modalSlave标志。

我们将使用ui.router$stateChangeStart事件来拦截状态更改,并根据需要取消更改,这是我们打开模式的地方。

挑战性

  • 如果有一个模态,我们需要保持对模态状态的了解
  • 阻止状态更改还可以防止URL更改,因此我们需要手动进行操作
  • 使用浏览器的“后退”按钮应关闭该模式,并使我们返回到其下方的状态。

代码

请注意,所有代码都在coffeescript和Jade中,我发现它更加整洁。如果您需要转录,请使用js2coffee.org

路由器配置:

.config ($stateProvider, $urlRouterProvider)->

  # Add details on which templates can open models containing which other 
  # templates.
  $stateProvider.state 'shop',
    url: '/'
    templateUrl: 'shop.html'
    modalMaster: true

  $stateProvider.state 'item',
    url: '/item/{id}'
    templateUrl: 'item.html'
    modalSlave: true

  $urlRouterProvider.otherwise('/');

  # Enable handling of url changes ourselves.
  $urlRouterProvider.deferIntercept()

最后一行很重要,因为它允许我们停止url更改,稍后再更新视图。

状态和URL事件侦听器

.run ($rootScope, $state, $modal, $location, $urlRouter, $timeout)->   
  # set some flags for use later.
  modalInstance = toStatePrevented = entering = null    
  # Intercept state changes - if we're in a modal master and we're going to a
  # modal slave, open a modal containing the slave state instead.
  $rootScope.$on '$stateChangeStart', (event, toState, toParams, fromState)->
    if fromState.modalMaster and toState.modalSlave
      event.preventDefault()
      # set a property to show which state is currently in the modal
      $state.current.inModal = toState
      entering = true # for url handling
      $timeout -> # change url manually
        $location.path($state.href(toState, toParams), false)
      , 0 # the 0 timeout makes sure the preventDefault doesn't stop url 
          # change
      # open a modal containing the new state, you can merge this with 
      # modal specific properties like "resolve" etc. if you want them
      modalInstance = $modal.open(toState)
      # clear our flags when the modal closes - this only uses dismiss so we
      # only need "catch" right now.
      modalInstance.result.catch(()->
        modalInstance = toStatePrevented = $state.current.inModal = 
          entering = null
        $state.go(fromState)
      )

  $rootScope.$on '$locationChangeSuccess', (event, toUrl, fromUrl)->
    event.preventDefault()
    # if there is nothing in a modal, just handle as normal
    if !$state.current.inModal? then $urlRouter.sync()
    # dismiss modal if url changes and modal is visible
    else if not entering and modalInstance? then modalInstance.dismiss()
    # if we are opening a modal, set a flag so that next time the url changes
    # we will dismiss it.
    else entering = false

评论应解释其中的大部分内容。在实践中,您可能需要的不仅仅是这里的内容,例如,您应该确保正确处理了从模态内部单击链接的情况,但这应该可以帮助您开始。

自然,我在这里演示了此解决方案,但是请确保您使用“在单独的窗口中启动预览”功能来查看所有功能是否全部发挥作用。

结果

从导航shop到会item打开模式,但是直接item通过URL导航到会自动打开项目ui-view

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果用户刷新页面,是否可以维护通过jquery事件显示的内容?

来自分类Dev

Vue.js 显示用户刷新页面时应由 v-if 标签隐藏的内容

来自分类Dev

PHP-在新页面上根据用户选择显示MySQL数据

来自分类Dev

在Python的新页面上显示数据

来自分类Dev

用户融合显示内容

来自分类Dev

在特定页面上显示内容

来自分类Dev

在特定页面上显示内容

来自分类Dev

显示用户在页面上的时间

来自分类Dev

vTiger CRM 6.3无法添加新用户:用户名显示为灰色

来自分类Dev

仅向新用户显示屏幕反应导航 v3

来自分类Dev

如何在新页面上显示AJAX响应

来自分类Dev

使用Flask在新页面上将HTML表单数据显示为JSON

来自分类Dev

在页面上显示模型内容并“检查是否为空”,MVC

来自分类Dev

主详细信息控件不会在新页面中显示内容

来自分类Dev

使用Instagram基本显示更新用户访问令牌

来自分类Dev

如何在Magnolia CMS中向登录用户显示页面的某些内容部分

来自分类Dev

仅显示与用户关联的内容

来自分类Dev

需要手动刷新页面才能显示登录的用户名

来自分类Dev

Ruby on Rails - 在新页面/控制器上显示用户名

来自分类Dev

在PHP中向随机用户显示html内容

来自分类Dev

灯箱内容显示在页面上

来自分类Dev

领域模态的新用户

来自分类Dev

html:显示本地化页面内容而无需打开新页面或离开当前页面

来自分类Dev

创建一个页面以显示特定用户创建的内容

来自分类Dev

单击页面上的链接,这将更改新页面上显示的选项卡

来自分类Dev

为登录(退出)用户显示不同的内容。Django 测试

来自分类Dev

刷新页面仍然显示动画?

来自分类Dev

属性未显示在用户#显示页面上

来自分类Dev

为什么将 SelectedItem 作为自定义对象传递到新页面后没有显示内容?

Related 相关文章

  1. 1

    如果用户刷新页面,是否可以维护通过jquery事件显示的内容?

  2. 2

    Vue.js 显示用户刷新页面时应由 v-if 标签隐藏的内容

  3. 3

    PHP-在新页面上根据用户选择显示MySQL数据

  4. 4

    在Python的新页面上显示数据

  5. 5

    用户融合显示内容

  6. 6

    在特定页面上显示内容

  7. 7

    在特定页面上显示内容

  8. 8

    显示用户在页面上的时间

  9. 9

    vTiger CRM 6.3无法添加新用户:用户名显示为灰色

  10. 10

    仅向新用户显示屏幕反应导航 v3

  11. 11

    如何在新页面上显示AJAX响应

  12. 12

    使用Flask在新页面上将HTML表单数据显示为JSON

  13. 13

    在页面上显示模型内容并“检查是否为空”,MVC

  14. 14

    主详细信息控件不会在新页面中显示内容

  15. 15

    使用Instagram基本显示更新用户访问令牌

  16. 16

    如何在Magnolia CMS中向登录用户显示页面的某些内容部分

  17. 17

    仅显示与用户关联的内容

  18. 18

    需要手动刷新页面才能显示登录的用户名

  19. 19

    Ruby on Rails - 在新页面/控制器上显示用户名

  20. 20

    在PHP中向随机用户显示html内容

  21. 21

    灯箱内容显示在页面上

  22. 22

    领域模态的新用户

  23. 23

    html:显示本地化页面内容而无需打开新页面或离开当前页面

  24. 24

    创建一个页面以显示特定用户创建的内容

  25. 25

    单击页面上的链接,这将更改新页面上显示的选项卡

  26. 26

    为登录(退出)用户显示不同的内容。Django 测试

  27. 27

    刷新页面仍然显示动画?

  28. 28

    属性未显示在用户#显示页面上

  29. 29

    为什么将 SelectedItem 作为自定义对象传递到新页面后没有显示内容?

热门标签

归档