javascript - 使用 Angular 4 的 Ionic 3 中组件和提供者(用于全局变量)之间的两种方式数据绑定(bind)

标签 javascript angular data-binding ionic3

我有以下代码:

app.html:

<ion-menu [content]="content">
    <ion-content [ngStyle]="{'background': 'linear-gradient(#'+menuColor1+', #'+menuColor2+')'}">
        ...
    </ion-content>
</ion-menu>

<ion-nav #content [root]="rootPage" swipeBackEnabled="false"></ion-nav>

app.components.ts:

import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';

import { TabsPage } from '../pages/tabs/tabs';
import { GlobalsProvider } from '../providers/globals/globals';

@Component({
  templateUrl: 'app.html'
})
export class MyApp {
  rootPage: any = TabsPage;

  menuColor1: string = GlobalsProvider.MENU_COLOR_1;
  menuColor2: string = GlobalsProvider.MENU_COLOR_2;

  constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
        GlobalsProvider.MENU_COLOR_1 = "f00";
        GlobalsProvider.MENU_COLOR_2 = "ff0";

        console.log(GlobalsProvider.MENU_COLOR_1); // f00
        console.log(this.menuColor1); // 000 (expected: f00)

        console.log(GlobalsProvider.MENU_COLOR_2); // ff0
        console.log(this.menuColor2); // 000 (expected: ff0)
    });

    platform.ready().then(() => {
      // Okay, so the platform is ready and our plugins are available.
      // Here you can do any higher level native things you might need.

      statusBar.styleDefault();
      splashScreen.hide();
    });
  }
}

globals.ts:

export const GlobalsProvider = {
    MENU_COLOR_1: "000",
    MENU_COLOR_2: "000",
}

我想在 app.component.tsglobals.ts 之间进行双向数据绑定(bind),每次使用 vars MENU_COLOR_1MENU_COLOR_2 已更改,也更新 menuColor1menuColor2 值(我将更新 MENU_COLOR_1 MENU_COLOR_2 将来也会来自其他组件,我希望 menuColor1menuColor2 接收这些更改)。

有可能吗?

最佳答案

对象是可变的并且通过引用传递。原始类型,如 string 不是,因此它们不会像您希望的那样改变。所以你应该做的是使用对象:

menuColor1 = GlobalsProvider;
menuColor2 = GlobalsProvider;

ngOnInit() {
  GlobalsProvider.MENU_COLOR_1 = "f00";
  GlobalsProvider.MENU_COLOR_2 = "ff0";

  console.log(GlobalsProvider.MENU_COLOR_1); // f00
  console.log(this.menuColor1.MENU_COLOR_1); 

  console.log(GlobalsProvider.MENU_COLOR_2); // ff0
  console.log(this.menuColor2.MENU_COLOR_2); 
}

但是要非常小心,因为如前所述,对象是通过引用传递的,所以有时您可能不希望这种行为。

关于javascript - 使用 Angular 4 的 Ionic 3 中组件和提供者(用于全局变量)之间的两种方式数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47502179/

相关文章:

javascript - 为javascript创建按钮

javascript - 使全局快捷方式可在 Electron 应用程序中配置

angular - HostListener 适用于 ngModel,但不适用于 FormControl

javascript - 为什么 Angular 2 或 Angular 4 使用香蕉括号?有什么具体原因吗?为什么他们不遵循与 Angular 1 相同的模式?

wpf - 将 Wpf HierarchicalDataTemplate ItemsSource 绑定(bind)到字典中的 CollectionViewSource?

javascript - dotVVM 将值从数据绑定(bind)的 DOM 元素传递到 JavaScript 变量以进行可视化

javascript - 使用 vue init 创建的应用程序抛出错误

javascript - 使用空白值初始化 JQuery Datepicker

angular - 按顺序处理请求

android - 高阶函数作为绑定(bind)适配器的问题