AngularJS应用程序是否有一个;堆叠?“;

AngularJS应用程序是否有一个;堆叠?“;,angularjs,Angularjs,我正在创建一个AngularJS应用程序。此应用程序有一个“屏幕”,用户可以在其中选择一系列选项。其中一个选项加载客户列表。在该客户列表中,我可以选择创建一个客户: [Main Menu] (/) -> [Options Select] (/options) -> [Customer Picker] (/options/customer) -> [Customer Create] (/options/customer/add) 因此,基本上,Cust

我正在创建一个AngularJS应用程序。此应用程序有一个“屏幕”,用户可以在其中选择一系列选项。其中一个选项加载客户列表。在该客户列表中,我可以选择创建一个客户:

[Main Menu] (/) 
    -> [Options Select] (/options)
    -> [Customer Picker] (/options/customer)
    -> [Customer Create] (/options/customer/add)
因此,基本上,
Customer Create
就是这个应用程序可以处于的“状态”。如果我使用UI导航,然后重新加载页面,从这个页面开始,它就没有什么不同,因为角度应用本身并不考虑我如何得到这个页面是一个“堆栈”的项目。这里没有我弹出的视图控制器,只有一堆独立的可路由目的地

我习惯于认为我可以实例化一个customer picker控制器,然后将它放到堆栈上并转换到它。。。但这在这里不起作用,是吗


比如说,如果我想让客户应用程序采集器“更智能”,那么我必须想出一些方法,让客户采集器知道我通过路由器传递给它的某种选项,或者根据我想要的每个特定用例创建一个微小的变化。

因此,默认情况下,Angular没有类似的功能,但是通过使用
$localtionProvider
或其他库,有许多不同的方法可以处理此问题

  • 您可以使用
    $locationProvider.path()
    来提供哈希标记或HTML5(真实)路径
  • 您可以使用
    $locationProvider.search()
    将URL中的对象传递到持久状态
  • 您可以使用客户端可用的任何方法在客户端上保存更复杂的状态
如果您还使用
$routeProvider
并使用它切换控制器/视图,那么您可以在不同视图之间使用简单的链接,这可能是一种使用稍微简单一些的代码来完成所需任务的方法

特别是对于您希望执行的操作(如果我正确理解的话),您可以使用
$locationProvider.search()
方法来存储堆栈信息。大概是这样的:

$scope.go = function (where) {
    var currentSearch = $location.search();
    currentSearch.viewStack.push(where);
    $location.search(currentSearch);
    $location.path(where);
}
使用
$locationProvider.search()
时需要注意的一点是,它不会存储多个级别的对象,这意味着传递到该函数中的对象不应包含简单类型和数组以外的任何内容

使用这种方法,您必须在顶级控制器中添加一些内容,以解释要放入搜索的
viewStack
数组。这里一种流行的模式似乎是在应用程序的根节点上有一个长期存在的控制器,然后在其下有其他临时控制器。您也可以将顶级控制器用于其作用域,但这会进入一种您可能希望避免的模糊“全局”作用域


angular最大的优点是它允许您限制您使用的JS。无论何时,只要你能少用定制编写的JS,多依赖angular的工作方式,从长远来看,它似乎会让你变得更好。

控制器是视图模型,因此如果你需要选择器保持打开状态,只要你回到打开的页面,将选择器逻辑和数据迁移到将保持选择器状态(打开/关闭)的服务中。AngularJS apss没有堆栈,除非你自己创建一个。我想我的部分问题是我一直在使用jQuery移动适配器。angular的某些功能在使用时被禁用。我对目前缺少的东西还可以接受,但是$routeProvider缺少了很多。也许我会试着摆脱它,看看它是如何工作的。另外,我想对你的评论投赞成票,但我不觉得它特别直接地回答了这个问题。如果您想添加更多关于Angular如何/为什么不能作为堆栈工作的信息,我非常乐意将您的答案标记为可接受!