我对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
数组}
答案 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中的对象。