在Angular中使对象数组和子对象保持同步

时间:2018-11-05 02:01:55

标签: angular ionic3

我对Angular,Ionic等还很陌生,但是对保持对象阵列同步存在疑问。

说我有一个名为Devices的提供程序:

import { Injectable } from '@angular/core';
import { Platform } from 'ionic-angular';

@Injectable()
export class Devices {

  public devices: any;  

...

现在在我的一个组件中,我抓取设备内部的对象之一并更新属性:

import { Devices } from '../../providers/devices/devices';

@IonicPage()
@Component({
  selector: 'page-device-list',
  templateUrl: 'device-list.html',
})
export class DeviceListPage {

  device: any;

  constructor(public navCtrl: NavController, public navParams: NavParams, 
      public devices: Device) {

this.device = this.devices.devices[0];
this.device.name = "A new name";
...

问题在于this.device是对该对象的本地引用。我希望能够使这些本地对象与服务(Devices.devices)中的全局对象保持同步,以便在更新本地引用时,我还可以更新Devices provider中的值,以便其他组件可以利用该值提供程序将被更新。

是否有一种“角度”方式做到这一点,或者我需要在提供者内部编写某种setDevice函数,以便用{{1}的新值重建devices数组}

2 个答案:

答案 0 :(得分:0)

this.devices.devices[0].name = "A new name"

我认为可以。

您也可以使用

  

BehaviorSubject

要注意其他组件设备已更改。

答案 1 :(得分:0)

通过引用访问Javascript中的对象。因此,如果您直接访问服务中的对象或将对象本身分配给局部变量,而不是将其属性分配给局部变量,则它将是同步的。另一种选择是每次进行更改时都使用Object.assign()

更新:以下是一个小示例,可以快速了解对象在JS中的工作方式

var a  = {
 name: "John",
 age: 30
}
var b = a;

b.name = "Smith";

console.log(a.name);

let c = a;

let d = c.name;
d = "Mikey";

console.log(c.name, a.name, b.name);

这里,a,b和c都指向同一对象,因此,无论如何更改名称,这三个引用都将受到影响。 d但是没有指向对象。它仅存储name属性,更改它不会更改原始Object。 JSFiddle: http://jsfiddle.net/owr6fmub/1/

因此,您可以再次在本地存储该对象-它会创建另一个引用,并且会保持同步。但是,将对象属性存储在本地不会更改主对象。他们不会同步。

数组也一样。数组是Javascript中的对象。