在Angular2中,使用服务在组件之间共享数组数据?
object structure
{
data: 'data'
keys: ['key1', 'key2', ... , 'keyN']
}
* Service has a array of total objects.
totalObject = [object1, object2, ... , objectN]
首先,我像这样初始化了服务的selectedObject。
selectedObject = totalObject;
然后我在构造函数上初始化了Component B的selectedObject。
constructor(private wordService: WordService) {
this.words = wordService.selectedWords;
}
首先,组件B正确显示所有对象! 但是,当服务将新数组初始化为selectedObject时,组件B无法显示所选对象。
// It's not working...
// remove
this.selectedWords.splice(0, this.selectedWords.length);
// add
for(let i in WORDS) {
if(WORDS[i].keys.indexOf(key) >= 0) {
this.selectedWords.push(WORDS[i]);
}
}
答案 0 :(得分:2)
您只需创建一项服务并将其用作“单身”服务即可。
@Injectable()
export class DataService {
public selectedWords:string[] = [];
}
并且您在应用程序的顶层提供它,这样只会在您的应用程序中使用一个实例:
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, OtherComponent ],
bootstrap: [ App ],
providers: [ DataService ]
})
export class AppModule {}
答案 1 :(得分:1)
如果我理解你正在尝试做什么,那么你试图通过引用来操纵一个对象跨两个组件,一个服务作为一种代理,这样组件A到对象X的更改将会在组件B中可见。服务或多或少只是一个存储引用的地方。
通过这种方式,您将获得更高的稳定性,使其更容易调试,并使其更具可扩展性:
我试图做你正在做的事情(很确定我们都有)。随着时间的推移,它只是麻烦(特别是如果你把更多的组件扔进混合中)。即使初始设置看起来更复杂,使用通知/事件也更加明确。它更容易测试,因为您只是使用通知/事件中的有效负载进行测试(在测试中很容易触发),您不必设置其他组件并让它修改所使用的服务/参考在目标组件中。
但是,是的,整个"一个单身人士的参考一切都在看"事情只是麻烦。