2015-08-21 41 views
6

语境中央导航的清洁设计?

单页/ AJAX web应用程序

Basic代码结构

的LocationManager(负责更新浏览器散列和切换应用程序的位置,以不同的瓦片)

页面/瓷砖流程

基本信息>家居资讯>汽车资讯>购买选项>查看订单>输入支付和提交

问题

当用户从购买选择导航查看订单,长(5- 8秒)服务电话来计算订单详情。在通话的解决方案中,回调旨在将用户导航至Review Order页面。问题是,如果用户在这段时间内点击回到家庭信息,一旦呼叫解决,他们将被“自动”带到审核订单。非常尴尬的用户体验。

限制

取消呼叫是不是一种选择。需要解决方案来处理导航。

目前提出的实施

保存 “currentLocation” 之前作出calculateOrder电话。 将回调中的“currentLocation”作为desiredStartingPoint传递给setLocation方法。 内setLocation方法if(intendedStartingPoint === Locationmanager.currentLocation) {//Navigate}

概括起来讲,如果用户改变位置而通话过程中,在呼叫的决议,我们将无法导航,因为用户不希望被导航到查看订单在那时候。

这有效,对不对?

渔获

我们在应用,在那里setLocation被称为长期运行的调用回调中的许多地方。这意味着我将不得不使用新参数 - desiredStartingPoint更新所有setLocation调用。虽然这对我来说很有意义,但看起来它有可能会有点混乱。

关于如何清理和集中它的任何想法?

+0

裹在一个专门的函数定义的setLocation调用,它提供给查看订单回调,使专业函数还将desiredStartingPoint作为参数并处理desiredStartingPoint逻辑? – Soggiorno

+0

在通话返回之前关闭后退按钮(或任何操作)怎么办?否则,只需检查您的当前位置通话返回和重定向只有在正确的瓷砖上。 (注意:在这种情况下,用户可能会返回问题,修改某些数据,然后返回到正确的区块而不重新启动呼叫,导致重定向而没有保存/验证新数据,因此您应该至少自动重新启动数据更改的呼叫,但只是取消导航/数据更改的呼叫会更理想。) –

+0

@SzabolcsPáll无法“禁用”网站内的浏览器按钮。你所提出的解决方案是我在问题中概述的。 – antonpug

回答

5

所以,现在用户可以点击购买选项页面上的计算按钮。然后,您将显示某种加载指示器(希望) ,并向连接附件setLocation('ReviewOrder')的服务器发送异步请求。应用程序中有相当多的地方使用这种模式。

的意外的问题(从用户的角度来看)重定向是有,因为这种方法的服务器的数据检索和UI导航耦合。想到的解决方案是解耦它们,并从所有长时间运行的请求延续中删除setLocation调用 。它可以按照以下方式工作。

当用户点击计算按钮,你开始一个异步请求,并在同一时间立即导航到审查订购页面(这是从UX的角度很重要,因为用户现在清楚地认识到计算按钮导航到查看订单)。在Review Order页面上,显示一个加载指示符,表示类似于“请稍候,大约剩余10秒...”当请求完成时,隐藏加载指示器并显示数据。

这样,你的用户将有一个一致的UX知道每当他们点击你的应用程序中的按钮,同样的事情发生(他们浏览到一个视图),并且没有令人惊讶的自动魔法的重定向。

0

首先,如果用户能够回去改变任何进入先前页面的信息,它是无效的任何未决的服务电话是必须的。如果基于过期信息的服务呼叫返回,则必须将其丢弃。

这意味着,if(intendedStartingPoint === Locationmanager.currentLocation) {//Navigate}是不够的。你必须做一些像if(intendedStartingPoint === Locationmanager.currentLocation && /* no information altered in the meantime*/) {//Navigate}

现在为您设计的问题:这是一个有点难以构建的这个没有任何具体的代码,但你可以做到以下几点:

  • 提供手段来注册和LocationManager
  • 管理长时间运行的电话长时间运行的通话应该然后总是与LocationManager
  • LocationManager登记应确保最多一个长期运行的呼叫在某一时刻
  • 是活动如果发生任何位置变化,所有(或一个主动)长时间运行的呼叫必须无效
  • 长时间运行的呼叫的回拨应该检查它是否没有失效,并且只有在这种情况下才能导航。 LocationManager可以对所有回叫进行统一的处理。
  • 只要您愿意,新的长时间运行的呼叫可以取代/使已经运行的呼叫失效或被拒绝。

我希望这是有道理的在你的具体情况。

1

首先,通过异步调用计算订单详细信息,并通过javascript向最终用户显示/模拟进度条。

第二件事:不要在您的服务回调函数中强制执行ReviewOrder瓷砖开放。当服务完成计算时,您的回调函数检查当前图块,如果它不是ReviewOrder图块,则它将计算的信息存储在会话或本地存储中。

作为用户导航ReviewOrder瓦,比较有来自与所存储的订单的详细信息的用户订单细节(通过散列函数,例如)。

如果用户订单详细信息和存储的订单详细信息的哈希码相同,则显示保存的订单信息,否则再次调用服务。

重要提示:防止为了锻造,考虑以下方式:

在服务器上的计算订单的详细信息,生成唯一的订单ID,将被返回给用户。然后将计算的订单详细信息与此ID一起存储在服务器数据库中。如果用户没有更改订单详细信息,那么您的脚本将仅将此订单ID作为符号发布到服务器,该订单已被接受。然后阅读您的数据库并通过此ID处理订单。

如果订单未完成,则使用计划任务,清理未完成订单中的数据库(例如 - 订单,24小时前计算,但尚未完成)。

2

鉴于您无法阻止用户在图块之间导航,因此通知她计算延迟并不能解决整个问题。您可以告诉用户预计完成的时间,您可以显示进度条,并且您可以立即将她带到Review Order瓷砖以等待结果,但是如果她从瓷砖导航离开,则会留下您的原来的问题。

如果用户在完成所有信息后选择离开,她肯定会中断程序。将用户转移到Review Order将会是不好的。现在怎么办?

您很合理地建议与calculateOrder一起发送的回调函数应将intendedStartingPoint参数传递给setLocation。您担心这会要求您修改每个电话setLocation以适应新参数。永远不要害怕,JavaScript提供了一个简洁的方式来解决这个困境。

您可以在不修改现有调用的情况下向setLocation添加新参数。这只需要intendedStartingPointsetLocation的参数列表中的最后一个参数。然后,您的新版本setLocation可以检查intendedStartingPoint的值以查看它是否为undefined

如果intendedStartingPointundefined,您知道setLocation正在接收其中一个旧呼叫,那些不通过intendedStartingPoint的呼叫。在这些情况下,您会忽略intendedStartingPoint并按以前一样继续。否则,您将intendedStartingPoint与当前位置进行比较,然后根据比较结果继续。

更好的方法是将新参数设置为intendedStartingPoint,但名为options的对象包含intendedStartingPoint作为其属性之一。如果将来需要,您可以将其他可选值传递给setLocation

setLocation的新行为非常简单。设置新位置之前,请检查intendedStartingPoint是否等于当前位置。如果是这样,你不必做任何事情,因为用户已经在她想要成为的地方。但是,如果intendedStartingPoint是从当前位置不同,用户已导航了,所以你做这样的事情:

if (LocationManager.currentLocation !== options.intendedStartingPoint) { 
    // Tell the user that the calculation has finished. 
    // Ask her if she wants to return to Review Order now. 
}