2015-02-11 59 views
0

我有3种嵌套的状态:角路由和国家处理问题

$stateProvider 
     .state('A', {      
      url: '/a', 
      templateProvider: function ($templateCache) { 

       return $templateCache.get('pages/a.html'); 
      }, 
      controller: 'aController' 
     }) 

     .state('A.B', { 
      url: '/b', 
      templateProvider: function ($templateCache) { 

       return $templateCache.get('pages/b.html'); 
      } 
      controller: 'bController' 
     }) 

     .state('A.B.C', { 
      url: '/c',      
      templateProvider: function ($templateCache) { 

       return $templateCache.get('pages/c.html'); 
      }, 
      controller: 'cController' 
     }) 

比方说,一个是应用程序的初始状态。现在,当在状态A中点击状态B的链接时,调用$ state.go('。B',...),状态B必须从A获取参数,因此它可以使用该参数调用某个服务并呈现数据。

同样,当状态C点击一个链接状态B,C必须得到B组参数,因此它可以做正确的工作和显示数据。

第一个问题:

什么是要通过这些参数上下行的最佳方式?嵌套控制器是否错误,以便父范围在子范围中可见?还是应该将它们作为参数传递?

第二个问题(一种依赖于回答第一个):

应如何HTML模板来构造(尤其是关于对“用户界面视图”指令),浏览器,所以当返回按钮在来自B之后的状态C上被点击,模板B的控制器不被触发,以便状态B显示与在进入状态C之前相同的数据而不重新加载。

如果用户已经做出了如下转变:未来将其从A.

第三个问题后,这同样适用于点击回到状态B A-> B-> C,然后导航至一些不相​​关的状态D(例如,通过点击主菜单上的链接),然后在状态D中按下后退按钮,由于没有输入参数,我该如何防止控制器C崩溃?

四问题(有关第三):

前提:唯一的“正确”的方式来获得状态B是通过点击状态A,同样获得到C用户必须通过先A-> B。

那么,如何做我处理当用户手动输入,例如URL B,从一些零散状态d?再次,因为B没有输入参数,所有的东西都会崩溃。

谢谢。

回答

0

第一,第三和第四个问题可以通过在你的状态的url上使用参数来解决。例如,状态A.B的URL可以是/ b?x & y & z而不是just/b。然后从A到AB过渡,你可以使用:

$state.go('A.B', {x: "val1", y: "val2", z: "val3"}); 

这样就解决了,因为你传递参数,从A到B的第一个问题这解决了第三个问题,因为从返回后的状态ABC不会散架另一个状态,因为URL历史记录包含参数。很明显,这种方法将如何解决用户直接在地址栏中输入URL的第四个问题。

问题2提出了一个稍微要解决的问题。但是你可以做的是在A和B之间引入一个中间状态,其唯一目的是防止当按下后退按钮时重新加载状态A的控制器。

.state('A', { 
      abstract: true,      
      url: '/a', 
      templateProvider: function ($templateCache) { 

       return $templateCache.get('pages/a.html'); 
      }, 
      controller: 'aController' 
     }) 
.state('A.int', { 

      url: '/a/view', 
      template: <div></div>, 
      controller: 'aIntermediateController' 
     }) 
     .state('A.int.B', { 
      url: '/b', 
      templateProvider: function ($templateCache) { 

       return $templateCache.get('pages/b.html'); 
      } 
      controller: 'bController' 
     }) 

通知,我做了状态的抽象,让你不能直接导航到它。相反,您直接导航到A.int。当您最初加载状态A.int时,aController将在aIntermediateController执行之前执行一次。随后,任何状态更改为A.int将只执行一个IntermediateController。这就是你可以防止多次运行控制器的原因。 同样,您可以用相同的方式在状态B和C之间添加中间视图。

+0

感谢您的洞察力,其中一些可能会有所帮助。 – 2015-02-12 08:16:14

+0

再次问候。在玩了一段时间之后,我有一个后续问题:如果我不能/不想使用url params,但是状态定义的params属性呢?在这种情况下,我会在后退按钮上丢失参数。我可以实现某种缓存特定状态的参数,我可能会这样做,但如果你知道更好的方法,请分享。谢谢。 – 2015-02-13 11:18:01

+0

基本上,您尝试记住页面的状态,并在导航到页面时通过其他页面或直接通过地址栏记住该状态。回顾一个页面之间导航的状态很容易,因为您可以输入一些信息来构造状态。但是,如果您不使用URL参数,那么当用户通过地址栏导航到页面时,如何输入构建状态? – restassured 2015-02-13 15:18:21