2014-09-04 63 views
0

我的index.html资源结果确保整个应用

<body ng-controller="MainCtrl"> 
    <nav ng-show="items" mm-menu> 
     <ul> 
      <li ng-repeat="item in items">{{item.name}}</li> 
     </ul> 
    </nav> 
    <div ui-view></div> 
</body> 

定义控制器

MainCtrl($rootScope, MyResource) { 
    var p = function() { 
     return MyResource.query().$promise; 
    }; 
    p().then(function(data){ 
     $rootScope.items = data; 
    }); 
} 

SomeCtrl($rootScope){ 
    var myItems = $rootScope.items; 
    // myItems undefined 
    myItems[0].name 
} 

和国家

$stateProvider.state('somestate', function() { 
    //.... 
    url: '/something/:id', 
    controller: 'SomeCtrl' 
}); 

mm-menu仅仅是jQuery的一个指令。

SomeCtrlitems由于资源加载而在html呈现的时刻并不总是可用,但有些值总是从资源中返回。如何在资源返回后与所有控制器共享一些顶级资源数据并指定

  • 抽象国家的路要走吗?
  • 还是应该使用requireJS?
  • 也许角度数据?
  • jquery ajax调用后的手动引导?
  • 还有别的吗?

我使用的是angularJS v1.2.23,ui-router v0.2.10。

寻找性感的角度解决方案。

+0

要腾出东西在所有控制器,你可以使用的服务。否则,使用rootScope将可以正常工作。 – Billy 2014-09-04 08:47:33

回答

0

这似乎是一个数据共享问题,它有很多方面需要考虑。

一个解决方案将放置在$ mainCtrl的$范围内的“项目”。在这种情况下,所有子控制器作用域从mainCtrl作用域继承,因此可以在其自己的作用域内访问“$ scope.items”。这种做法的缺点是对范围的污染以及可能的错误覆盖 - 我会将它用于appConfig或类似的东西,而不是其他任何东西。

第2解决方案是有一些数据管理服务,负责获取的数据 - 这些数据管理员,你可以缓存的响应,并直接在第二个呼叫返回它们(这有它自己的风险方面数据波动性取决于案例)。你可以在数据管理器的控制器中“知道”,如果你为每个GET方法返回一个承诺,并且在你等待这个承诺在.then()情况下解决的控制器中,那么你可以设法获取一些数据。

第三个解决方案将通过事件。负责获取特定数据类型的ctrl将获取数据,当它准备好时,它将引发一个事件(例如“initDataReady”),该事件将由其他ctrls/etc进行处理。

就模板而言,您可以随时放置一些ng-if =“myModel.items!== null”,并且在加载项目时不会显示内容。你甚至可以放一个(显示加载指标)。

+0

感谢您的建议,但可能会调用/检查每个查看请求的资源并进行相应更新。 – Terafor 2014-09-05 06:03:50

+0

如果项目未被缓存,则可能会导致大量开销。而且,我不知道是否要缓存所有内容...... – 2014-09-12 13:35:52

0

经过与Angular(它的真棒顺便)的一些工作后,我已经开始使用以下结构来确保数据可用性和应用程序流与router-ui及其状态解析属性。

http://www.jvandemo.com/how-to-resolve-application-wide-resources-centrally-in-angularjs-with-ui-router/

与$ cacheFactory店顶部需要的结果。

嵌套视图还可以轻松在级别导航上使用转换(animate css)。

注意:解析的资源函数需要用于最小化的字符串依赖关系(ngAnnotate)。

resolve:{ 
      MyServivce: 'MyService', 
      item: ['MyService', function(MyService){ 
        MyService.doSomething().$promise; 
      }] 
} 

(写这个角度是1.3.0)