我想问你关于在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>
我的意图是所有子状态都会读取标题的值,当它从父模板更改时,值也会在子状态中更新。但是,它永远不会发生。该值在父状态下更新,但从不在子项中更新。
我错过了什么?
谢谢
答案 0 :(得分:3)
我会试着解释为什么这个要求应该被认为有点不同。
首先,状态的.data
设置(请参阅Attach Custom Data to State Objects)应被视为配置部分。含义:只读,常量。此外,正如.data
继承所示,有一些智能机制如何为almsot提供与上述相反的功能:
子状态将从父状态继承数据属性,它们可以覆盖它们。
$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。