angular数据绑定采用什么机制_angular依赖注入

angular数据绑定采用什么机制_angular依赖注入摘要:面对如何在现有的低版本的框架服务上,运行新版本的前端服务问题,华为云前端推出了一种融合方案,该方案能让独立的Angular项目整体运行在低版本的框架服务上,通过各种适配手段,让Angular项…

专家解读:利用Angular项目与数据库融合实例

摘要:面对如何在现有的低版本的框架服务上,运行新版本的前端服务问题,华为云前端推出了一种融合方案,该方案能让独立的Angular项目整体运行在低版本的框架服务上,通过各种适配手段,让Angular项目也能获取到外层框架服务的资源。

华为云前端服务前期采用AngularJs作为框架技术栈,技术较为老旧,性能较差,在华为云快速发展的今天,显然不能满足要求。因此我们必须要升级前端技术栈,使用Angular2+来承载我们的前端服务。GeminiDB作为新服务,也是数据库乃至华为云未来的重点服务,作为前端部分,必须在技术上使用最前沿的框架,以最大地提高用户体验。

但是技术栈的升级不是一蹴而就的,尤其是在华为云,所有的云服务必须在框架服务的底座上运行,而框架服务承载了所有的云服务,如果要进行技术栈升级,必然是一个缓慢的过程。GeminiDB作为华为云服务里的一员,也不可能脱离框架服务而存在。因此存在一个问题,就是如何在现有的低版本的框架服务上,运行新版本的前端服务。

为了解决以上问题,华为云前端推出了一种融合方案,该方案能让独立的Angular项目整体运行在低版本的框架服务上,通过各种适配手段,让Angular项目也能获取到外层框架服务的资源。

底层项目

底层项目使用webpack打包,打包后通过在index.html里引入businessAll.js文件,以该文件为入口启动整个框架服务。

<script type="text/javascript" src="businessAll.js"></script>

代码100分

在底层框架服务启动后,再渲染出具体云服务内容。

代码100分<div class="service-content-view" ui-view ng-animate="{enter:"fade-enter"}"></div>

Angular项目

Angular项目支持独立运行,有单独的index.html,也有单独的main.ts入口。但是如果希望Angular项目运行在底层框架服务上,就必须把Angular项目看作是一个独立的模块,把项目整体引入到底层项目中。因此,我们可以预先把Angular项目编译好,放到底层项目的一个目录下。在运行底层项目时,在index.html里将Angular项目引进来,独立运行。

<link rel="stylesheet" type="text/css" href="{底层项目中Angular项目的路径}/styles.css" />
<script type="text/javascript" src="{底层项目中Angular项目的路径}/runtime.js"></script>
<script type="text/javascript" src="{底层项目中Angular项目的路径}/polyfills.js"></script>
<script type="text/javascript" src="{底层项目中Angular项目的路径}/main.js"></script>

项目融合

底层项目和Angular项目均能独立,但是要让两者融合起来,会遇到以下几个问题:

1.底层项目中如何渲染出Angular项目。

2.Angular项目依赖底层项目的资源,如何保证Angular项目在底层项目运行起来后再运行。

3.如何解决底层项目和Angular项目的路由冲突问题。

渲染Angular项目

底层项目分为两部分,一部分是底层框架服务,另一部分是具体云服务。现在我们要做的是把老的云服务项目替换成新的Angular项目,因此我们可以直接在渲染老的云服务的地方替换成新的Angular项目的渲染容器。

代码100分<div class="service-content-view" ui-view ng-animate="{enter:"fade-enter"}"></div>
<app-root></app-root>

底层框架服务对页面渲染上做了一些体验上的优化,因此必须保留原模板中的ui-view,使底层项目正常运行起来,实际上老的云服务项目的渲染内容已经转发到新的Angular项目上面。

Angular项目对底层项目的依赖

底层框架服务给云服务提供了很多公共变量与服务,这些变量和服务是各个云服务必须要使用的,否则云服务将不能正常运作。

启动顺序问题

对于Angular项目来说,要使用底层框架服务提供的内容,首先要求Angular项目在底层项目运行起来之后再运行。这里采用Augular中的APP_INITIALIZER令牌来解决这个问题。APP_INITIALIZER是一个函数,在程序初始化的时候被调用。这里在根模块的providers中以factory的形式来配置。

import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core";

import { AppInitService } from "./services/app-init.service";
import { AppComponent } from "./app.component";

@NgModule({
 declarations: [AppComponent],
 imports: [BrowserModule],
 providers: [
     AppInitService,
    {
         provide: APP_INITIALIZER,
         useFactory: initializeApp,
         deps: [AppInitService],
         multi: true
    }
],
 bootstrap: [AppComponent]
})
export class AppModule {}

export function initializeApp(appInitService: AppInitService) {
   return (): Promise<any> => {
       return appInitService.Init();
  };
}

在appInitService里,先获取到底层框架的资源,再进行Angular项目的初始化。

import { Injectable } from "@angular/core";

@Injectable()
export class AppInitService {
   constructor() {}

   Init() {
       return new Promise<void>((resolve, reject) => {
           // 获取到底层框架服务的资源
           resolve();
      });
  }
}

资源依赖问题

底层项目使用的是AngularJs,Angular项目获取底层框架服务提供的资源不能通过Angular的方式引入,因此需要借助AngularJS的注入器获取在底层框架中注册的服务组件:

static get(inject: string): any {
return (window as any).angular.element("html").injector().get(inject);}
如,要获取 $rootScope:
 rootScope = (window as any).angular.element("html").injector().get(‘$rootScope’);

路由冲突问题

Angular项目本身有自己的路由,但是Angular项目是运行在底层框架之上的,Angular项目的路由将会被底层框架所拦截。因此,我们也需要在底层框架的项目中配置相同的路由,以免Angular项目中的有效路由被底层框架识导向为404。

Angular项目路由:

{
   path: "",
   redirectTo: "ng2app1",
   pathMatch: "full"
},
{
   path: "ng2app1",
   loadChildren: "./ng2app1/ng2app1.module#Ng2app1Module",
},
{
   path: "ng2app2",
   loadChildren: "./ng2app2/ng2app2.module#Ng2app2Module",
}
 
底层框架路由:
var configArr = [
  {
       name: "ng2app1",
       url: "/ng2app1"
  },
  {
       name: "ng2app2",
       url: "/ng2app2"
  }
];

另外,由于底层项目使用的是hash路由,Angular项目中也要做相应的配置,默认是使用的是PathLocationStrategy,需要切换到hash模式。

import { LocationStrategy, HashLocationStrategy } from "@angular/common";

...
providers: [
  {
       provide: LocationStrategy,
       useClass: HashLocationStrategy
  }
]

总结

以上方案是在底层框架升级周期长的前提下的一个临时方案,实际上还是存在着不少的问题。比如底层框架对于老的云服务容器是有统一管理的,老的云服务容器会针对不同的场景能够自适应,而融合方案中的Angular项目则不能;每次启动整个项目时,必须要预先编译好里面的Angular项目,再去启动外层的底层框架,开发效率比较低。因此,后续GeminiDB服务应该在底层框架升级后,尽快适应到新的底层框架体系中,提高服务的可用性和稳定性。

 

点击关注,第一时间了解华为云新鲜技术~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7725.html

(0)
上一篇 2023-03-15
下一篇 2023-03-15

相关推荐

  • mysql怎么跑代码_java预编译sql

    mysql怎么跑代码_java预编译sql工作中最常遇到的问题,怎么给线上频繁使用的大表添加字段?
    比如:给下面的用户表(user)添加年龄(age)字段。
    有同学会说,这还不简单,直接加不加完了,用下面的命令:

    2023-06-09
    146
  • 反诈困境,国有大行如何破局?[亲测有效]

    反诈困境,国有大行如何破局?[亲测有效]近年来,各类欺诈案件屡见报端,“金融造富”的骗局防不胜防。网上银行欺诈、电话银行欺诈、网络欺诈、电信欺诈、盗刷银行卡、POS机套现、贷款欺诈……庞大的利益诱惑下,金融诈骗黑产的水深不见底。各大银行风控

    2023-05-25
    152
  • [mysql]double/float/decimal「建议收藏」

    [mysql]double/float/decimal「建议收藏」[mysql]double/float/decimal double 可以有小数,虽然navicat里显示0,0 FLOAT 和 DOUBLE 在不指定精度时,默认会按照实际的精度(由计算机硬件和操…

    2022-12-15
    159
  • Python将数组转化为列表

    Python将数组转化为列表在Python编程中,数组是一种常见的数据结构。数组由一些固定大小的元素组成,这些元素可以是任何数据类型,例如整数、浮点数、字符串等。列表是Python中最基本的数据结构之一,列表由一些可变大小的元素组成,这些元素可以是同一数据类型或不同数据类型的元素。数组和列表在Python编程中有着广泛的应用,经常需要将数组转化为列表或列表转化为数组。本文将围绕如何用Python将数组转化为列表为中心,从多个方面进行详细阐述。

    2024-07-19
    38
  • JuiceFS 如何帮助趣头条超大规模 HDFS 降负载「终于解决」

    JuiceFS 如何帮助趣头条超大规模 HDFS 降负载「终于解决」作者简介 王振华,趣头条大数据总监,趣头条大数据负责人。 王海胜,趣头条大数据工程师,10 年互联网工作经验,曾在 eBay、唯品会等公司从事大数据开发相关工作,有丰富的大数据落地经验。 高昌健,Ju

    2023-04-25
    159
  • Python邮件发送测试:如何确保邮件的送达性和有效性

    Python邮件发送测试:如何确保邮件的送达性和有效性在现代社会,邮件已经成为人们不可或缺的沟通工具。而Python作为一种强大的编程语言,也提供了多种邮件发送的库和模块。然而,虽然发送邮件变得非常简单,但仍然存在一些问题需要我们注意。本文将从多个方面详细阐述如何确保邮件的送达性和有效性。

    2024-03-06
    79
  • mysql索引查询失效的情况有哪些_导致索引失效的情况

    mysql索引查询失效的情况有哪些_导致索引失效的情况一:不在索引上使用函数,计算等 在kq_time上增加了一个索引,见图一 我们使用date()函数进行查询,见图二 图二根据kq_time字段查询并没有使用索引,我们可以根据kq_time换一种写法…

    2023-04-04
    161
  • Python实现网站登录功能优化

    Python实现网站登录功能优化登录验证方式对于网站的安全性至关重要。不同的验证方式有不同的优缺点,需要根据具体情况进行选择。

    2024-01-26
    99

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注