【发布时间】:2017-03-17 19:02:41
【问题描述】:
Plnkr:https://plnkr.co/edit/Brmcxd2LjGVJ6DXwuJtF?p=preview
架构:
$login -> $container(包含$dashboard和$feed),dashboard包含:$tickers,$tags,$viewHeader和$socialMedia组件。
目标:
tags 需要通信并将标签对象发送到viewHeader 和socialMedia 状态。
预期:
Login 之后,在标签列表中选择一个按钮应该会将 tag 发送到 ViewHeader 和 SocialMedia 状态/组件。
结果:
Login 之后,在标签中选择一个按钮并转到 $state dashboard $states 以进行 ViewHeader 和 SocialMedia 刷新但视图模型变量{{ term }} 不会更新为任一组件中的相应标记。
设计说明:
我试图通过混合状态、组件、兄弟组件和视图来解决的问题是,当任何状态发生变化时,应用程序中的每个组件都会刷新/重新启动。 $state.go('dashboard'...
这并不理想,我想要的是确保只有需要刷新的组件,刷新。
IE:当我选择 Ticker 或 Tag 时,我不希望 Feed 组件每次都刷新。但是,用户应该能够在 Feed 组件中执行操作,并且它将更新所有其他组件。
这就是我创建container 状态来同时保存dashboard 和feed 状态的原因。最初我的所有东西都处于dashboard 状态,并且任何时候$state.go('dashboard' 发生feed 组件也会刷新。如果有更好的方法来解决这个问题lmk! :)
PS:开始学习使用 ui-router 进行状态管理,以消除对 $rootScope 的依赖。到目前为止,我的真实应用程序要稳定得多,但有一个烦人的功能,即每个组件都会刷新/重新启动。
在下面的屏幕截图中,我可以清楚地看到正确的 tag 被传递到正确的 $states,但 {{ term }} 没有更新。
代码 sn-ps(Plnkr 中的完整代码)
app.container.html(容器状态)
<div>
<dashboard-module></dashboard-module>
<feed-module></feed-module>
<!--<div ui-view="dashboard"></div>-->
<!--<div ui-view="feed"></div>-->
</div>
dashboard.html(仪表板状态)
<div class="jumbotron text-center">
<h1>The Dashboard</h1>
</div>
<div class="row">
<tickers-module></tickers-module>
<!-- Tags component goes here -->
<div ui-view></div>
<view-module></view-module>
<social-module></social-module>
</div>
^ 我使用上面的<div ui-view> 来加载标签状态的原因是,到目前为止,这是我可以初始化标签模块并显示来自代码组件的标签列表的唯一方法。
tickers 组件控制器:
tickers.component('tickersModule', {
templateUrl: 'tickers-module-template.html',
controller: function($scope, $state) {
console.log('Tickers component', $state.params);
$scope.tickers = [
{ id: 1, ticker: 'AAPL' },
{ id: 2, ticker: 'GOOG' },
{ id: 3, ticker: 'TWTR' }
];
$state.go('tags', { ticker: $scope.tickers[0] }); // <---
$scope.clickTicker = function(ticker) {
$state.go('tags', { ticker: ticker });
}
}
^ 上面的
var tags = angular.module('tags', ['ui.router'])
tags.config(function($stateProvider) {
const tags = {
parent: 'container',
name: 'tags',
url: '/tags',
params: {
ticker: {}
},
template: '<tags-module></tags-module>',
controller: function($scope, $state) {
console.log('Tags state', $state.params);
}
}
$stateProvider.state(tags);
})
tags.component('tagsModule', {
templateUrl: 'tags-module-template.html',
controller: function($scope, $state) {
console.log('Tags component', $state.params);
const tags_model = [
{
ticker: 'AAPL',
tags : [{ id: 1, term: 'iPhone 7' }, { id: 2, term: 'iPhone 8' }, { id: 3, term: 'Tim Cook' }]
},
{
ticker: 'GOOG',
tags : [{ id: 4, term: 'Pixel' }, { id: 5, term: 'Pixel XL' }, { id: 6, term: 'Chrome Book' }]
},
{
ticker: 'TWTR',
tags : [{ id: 7, term: 'tweet' }, { id: 8, term: 'retweet' }, { id: 9, term: 'moments' }]
}
];
function matchTags(ticker, model) {
return model.filter(function(obj){
if (obj.ticker === ticker) { return obj; }
});
}
$state.params.ticker = $state.params.ticker || {};
$scope.tags_model = matchTags($state.params.ticker.ticker, tags_model)[0];
$scope.clickTag = function(tag) {
console.log(' Tag clicked', $state);
$state.go('dashboard', { tag: tag });
}
}
});
标签列表中的点击功能:
$scope.clickTag = function(tag) {
console.log(' Tag clicked', $state);
$state.go('dashboard', { tag: tag });
}
社交媒体控制器:
social.component('socialModule', {
templateUrl: 'social-module-template.html',
controller: function($scope, $state) {
console.log('Social component', $state.params);
$scope.term = $state.params.tag.term;
}
});
viewHeader 控制器:
view.component('viewModule', {
templateUrl: 'view-module-template.html',
controller: function($scope, $state) {
console.log('View component', $state.params);
$scope.term = $state.params.tag.term;
}
});
奇怪的组件加倍
刚刚注意到这一点,在单击一个标签并闯入 social.component 之后。看起来仪表板组件正在重新渲染一瞬间代替标签组件:
更新,通过在标签中添加{ refresh: true } 到 $state.go 解决了这里的问题。但是请注意,这仍然没有解决我最初的任务,即阻止 feed.component 刷新。所以最终会使用服务。
【问题讨论】:
-
stackoverflow.com/questions/24575491/… ,请检查此链接,它应该可以解决您的问题。基本上你需要解决你的参数。
-
@Pramod_Para 我不确定是不是这样,因为我有我的参数命名。此外,在我的 plnkr 中,即使我在标签按钮单击时进入状态
dashboard,状态也不会初始化,组件也不会再次出现。 -
可以吗,如果我为您提供一个不同的示例,它将指导您如何将参数从父状态传递到兄弟状态。?
-
那太棒了,我也想做的是确保只有我想要更新的兄弟状态刷新,而不是我不想更新的状态。 IE:在我的示例中为
feed。股票代码 -> 更新标签 -> 更新社交,提要保持不变并且不会重新初始化。 -
抱歉,对我来说这是漫长的一天,今天凌晨 3 点肯定会更新您的 plunkr。
标签: javascript angularjs routing angular-ui-router state-management