多个pageAbility之间如何共享变量?

多个pageAbility之间如何共享变量

阅读 460
avatarAI BotBETA

在JavaScript中,有多种方法可以在多个pageAbility之间共享变量。以下是几种常见的方法:

  1. 使用全局变量:全局变量可以在整个应用程序中访问,因此可以在任何pageAbility中访问它们。然而,这种方法并不推荐,因为它可能会导致命名冲突和不可预测的行为。
  2. 使用闭包:闭包可以捕获其外部函数的变量,并可以在该作用域之外访问它们。这可以在不同的pageAbility之间共享变量。例如:
function createAbility() {
  let sharedData = "shared data";
  return {
    data: sharedData,
    setSharedData: function(newData) {
      sharedData = newData;
    }
  };
}
const ability1 = createAbility();
const ability2 = createAbility();
ability1.setSharedData("new data");
console.log(ability2.data); // "new data"
  1. 使用模块模式:模块模式是创建可重用的代码块的最佳方式,并且可以在不同的pageAbility之间共享变量。例如:
var myModule = (function () {
  var sharedData = "shared data";
  return {
    setData: function (newData) {
      sharedData = newData;
    },
    getData: function () {
      return sharedData;
    }
  };
})();
var ability1 = myModule;
var ability2 = myModule;
ability1.setData("new data");
console.log(ability2.getData()); // "new data"
  1. 使用服务模式:在服务中定义共享数据,然后在每个pageAbility中注入该服务。例如:
angular.module('myApp').service('SharedDataService', function() {
  var self = this;
  self.data = "shared data";
  self.setData = function(newData) {
    self.data = newData;
  };
});
angular.module('myApp').controller('Ability1Ctrl', function($scope, SharedDataService) {
  $scope.sharedData = SharedDataService.data;
  $scope.setSharedData = function(newData) {
    SharedDataService.setData(newData);
  };
});
angular.module('myApp').controller('Ability2Ctrl', function($scope, SharedDataService) {
  $scope.sharedData = SharedDataService.data;
});
3 个回答
  • 方式一:可以通过用户首选项实现数据持久化。

    import dataPreferences from '@ohos.data.preferences';   
    import { BusinessError } from '@ohos.base';   
       
    let preferences: dataPreferences.Preferences \| null = null;   
    try {   
     preferences.put('startup', 'auto', (err: BusinessError) =\> {   
     if (err) {   
     console.error(\`Failed to put data. Code:\${err.code}, message:\${err.message}\`);   
     return;   
     }   
     console.info('Succeeded in putting data.');   
     })   
    } catch (err) {   
     console.error(\`Failed to put data. Code: \${err.code},message:\${err.message}\`);   
    }   
    try {   
     preferences.flush((err) =\> {   
     if (err) {   
     console.error(\`Failed to flush. Code:\${err.code}, message:\${err.message}\`);   
     return;   
     }   
     console.info('Succeeded in flushing.');   
     })   
    } catch (err) {   
     console.error(\`Failed to flush. Code:\${err.code}, message:\${err.message}\`);   
    }
    
  • 方式二:可以通过@StorageLink搭配PersistentStorage接口可以实现数据本地持久化。

     import router from '@ohos.router';   
        
     PersistentStorage.persistProp("time", "Hello, OpenHarmony")   
        
     @Entry   
     @Component   
     struct ComponentTest {   
      // 初始化time1,如果AppStorage   
      @StorageLink('time') time1: string = "1648643734154";   
      @StorageLink('time') time2: string = "OpenHarmony";   
      build() {   
      Column({ space: 10 }) {   
      Text(\`父组件【\${this.time1}】\`)   
      .fontSize(20)   
      .backgroundColor(Color.Pink)   
      Button('更新时间')   
      .onClick(() =\> {   
      this.time2 = new Date().getTime().toString();   
      })   
      Button('跨页面数据绑定')   
      .onClick(() =\> {   
      router.pushUrl({ url: "pages/test/setting" })   
      })   
      }   
      .width('100%')   
      .height('100%')   
      .padding(10)   
      }   
     }
    

你可以创建一个全局的状态管理模块,所有的PageAbility都从这个模块中获取和更新状态。这样,你可以在全局范围内管理和同步变量。

本文参与了思否 HarmonyOS 技术问答马拉松,欢迎正在阅读的你也加入。

1.设置全局变量 pages
首先,我们需要设置一个全局变量 pages,用于存储共享的数据。在代码中添加以下行:
// 创建全局变量 pages
global.pages = [];
这段代码创建了一个名为 pages 的全局变量,并将其初始化为空数组。
2.导出 Ability
接下来,我们需要将 Ability 导出,以便其他模块可以使用。在代码中添加以下行:
// 导出 Ability
module.exports = {
// ...
pages: global.pages,
};
这段代码使用 module.exports 将 pages 导出,使其可以在其他模块中使用。
本文参与了思否 HarmonyOS 技术问答马拉松,欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题