在ui-router中更改共享数据

时间:2014-09-27 18:40:59

标签: angularjs angular-ui-router

我想问你关于在ui-router中的状态之间共享数据的问题。这是我的$ stateProvider

的例子
$stateProvider.state('start',{
    url:"/inicio",
    templateUrl:"./app/templates/start.html",
    abstract: true,
    data:{
        title: 'Hello world'
    },
    controller: 'aplicacionController',

}).state('start.App',{
    url:"/aplicacion",
    templateUrl:"./app/templates/escritorio.html"
}).state('start.App.onlyMenu',{
    url:"/ms",
    views:{
        'menu':{
            templateUrl:"./app/templates/menu.html",
            controller:'menuController'
        },
        'mainFrame':{
            templateUrl: './app/templates/whiteBoard.html',
            controller:'whiteBoardController'
        }
    }
}).state('start.app.JqPlotCharts',{
    url:"/jqp",
    views:{
        'menu':{
            templateUrl:"./app/templates/menu.html",
            controller:'menuController'
        },
        'mainFrame':{
            templateUrl: './app/templates/jqplotcharts.html',
            controller:'jqplotCtrl'
        }
    }
});

正如您所看到的,我有一个名为start的父状态,其数据字段的title属性值为#34; Hello world"。 aplicacionController有两个任务:第一个是读取title的值并存储在名为title的$ scope变量中:

$scope.title = $state.current.data.title;

第二个是监视标题是否已更改,如果已经发生,请更新$ state.current.data.title的值:

$scope.$watch('title', function(){
    $state.current.data.titulo = $scope.title;
});

当然,在模板start.html中,我有一个小表单来更改此值:

<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <a class="navbar-brand" href="#">{{title}}</a>
    </div>

   <!-- Collect the nav links, forms, and other content for toggling -->
   <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <form class="navbar-form navbar-left" role="search">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="Search" ng-model="title">
        </div>
      </form>
   </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>

我的意图是所有子状态都会读取标题的值,当它从父模板更改时,值也会在子状态中更新。但是,它永远不会发生。该值在父状态下更新,但从不在子项中更新。

我错过了什么?

谢谢

1 个答案:

答案 0 :(得分:3)

我会试着解释为什么这个要求应该被认为有点不同。

首先,状态的.data设置(请参阅Attach Custom Data to State Objects)应被视为配置部分。含义:只读常量。此外,正如.data继承所示,有一些智能机制如何为almsot提供与上述相反的功能:

Inherited Custom Data

  

子状态将从父状态继承数据属性,它们可以覆盖它们。

$stateProvider.state('parent', {
      data:{
         customData1:  "Hello",
         customData2:  "World!"
      }
   })
   .state('parent.child', {
      data:{
         // customData1 inherited from 'parent'
         // but we'll overwrite customData2
         customData2:  "UI-Router!"
      }
   });

$rootScope.$on('$stateChangeStart', function(event, toState){ 
    var greeting = toState.data.customData1 + " " + toState.data.customData2;
    console.log(greeting);

    // Would print "Hello World!" when 'parent' is activated
    // Would print "Hello UI-Router!" when 'parent.child' is activated
})

正如我们所看到的,这是我们使用自定义state对象的.data配置所能做的。

但是如何解决我们的问题呢?嗯,确实存在原生的Angular JS解决方案:

  

<强>服务即可。

此类对象将作为 singleton 工作。我们可以拥有它,我们可以将它放入$rootScope ......我们可以做很多事情。但大多数情况下,我们可以将其用于数据共享。请参阅此处的类似示例和解决方案:

这是一个名为 Settings

的草稿服务
.factory('Settings', function(){
  return {
    Property1: null,
    Property2: null,
    ...
  };
})

此示例的plunker