干货 | 基于Angular开发语言下 Iframe 父子页面交互

简介:

作者简介

周小辉是一名高级软件工程师,从事Java和Web程序开发,近期项目是基于Angular框架开发的web项目,今天他为大家带来项目开发中碰到的难点,该问题是Angular框架下实现动态加载架构的有效方案,希望对大家有所启发。


有这样一个需求,存在父子页面,子页面有个输入框,父页面有个提交按钮,点击提交按钮,触发子页面的输入框参数校验,如果校验失败,则显示提示信息。iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同。这里主要描述重点是基于Angular开发语言的交互,因此以同域链接场景为例。

我们知道同域链接场景父页面调用子页面方法: 

FrameName.window.childMethod();

当获得子iframe窗口的window对象时就可以交互,子页面在基于传统的js框架,如jquery实现的话,会是下面这样

function childMethod(){

   var number=    $('#number').value();

   if(number=='' || number.length>10){

   alert('号码范围为1-10位数字');

   }

 }

   jquery是基于dom开发的,但是在angular下,我们不直接操作dom,我们一般定义一个ngModel绑定到页面上,通过ngModel来获取值,这时,实现就无从下手了,好在Angular1.0提供了api,而Angular2.0没有开放任何接口

  Angular1.0

index.html中实现childMethod

function childMethod(){

var controllerScope = $('html[ng-controller="MainCtrl"]').scope(); 

controllerScope.check();

}

//相应的controller实现一个check方法,并声明为rootscope方法就行了

app.controller('MainCtrl', function($scope, $rootScope) {


});

app.controller('ChildCtrl', function($scope, $rootScope) {

   $scope.number = '';

   $rootScope.check = function() {

      if(number=='' || number.length>10){

      alert('号码范围为1-10位数字');

   }

});


 Angular2.0

index.html中实现childMethod

function childMethod(){

var component =  window['child'];

component .check();

}


组件实现check方法

export class ChildComponent implements OnInit {

    number:string;

    constructor(public changedDetector: ChangeDetectorRef, public translate: TranslateService) {

        window['child'] = this;

    }

    check(){

      if(number=='' || number.length>10){

      alert('号码范围为1-10位数字');

  

      this.changedDetector.markForCheck();    //解决变量修改失效问题

      this.changedDetector.detectChanges();

     }  

    }

可以看到,我们在ChildCompent的构造方法中,给window扩展了一个child属性,然后在子页面的index.html可以通过这个属性访问到该组件,是一个比较讨巧的用法;但是这样直接使用会有问题,当我们在ChildComponent 组件的check方法中操作原生的js语法时不会有问题,但是当我们需要修改某个ngModel的值时,会发现失效了,原因是我们通过 window['child'].check()时,浏览器没有监听到事件变化,因而没有重新渲染ChildComponent,我的理解是一般事件都是监听鼠标触发的,此时没有产生鼠标事件,自然监听不到;解决方案就是手动通知组件重新渲染,代码就是ChangeDetectorRef提供的markForCheck,detectChanges方法



原文发布时间:2018年04月18日 13:00:45

原文作者:周小辉

本文来源CSDN,如需转载请联系原作者

相关文章
|
11月前
|
开发框架 前端开发 测试技术
什么是 Angular 企业级应用开发中的 Breaking Change
什么是 Angular 企业级应用开发中的 Breaking Change
|
14天前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
24 0
|
14天前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
30 0
|
14天前
|
前端开发 安全 开发者
JSF文件上传,让Web应用如虎添翼!一招实现文件上传,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,文件上传是重要功能之一。JSF(JavaServer Faces)框架提供了强大的文件上传支持,简化了开发流程。本文将介绍JSF文件上传的基本步骤:创建前端表单、处理上传文件的后端Action类、将文件保存到服务器指定目录以及返回结果页面。通过示例代码,我们将展示如何利用JSF实现文件上传功能,包括使用`h:inputFile`控件和`ManagedBean`处理上传逻辑。此外,JSF文件上传还具备类型安全、解耦合和灵活性等优点,有助于提升程序的健壮性和可维护性。
22 0
|
14天前
|
开发者 Java 存储
JSF 与 CDI 携手共进,紧跟技术热点,激发开发者情感共鸣,开启高效开发新征程
【8月更文挑战第31天】JavaServer Faces (JSF) 与 Contexts and Dependency Injection (CDI) 在 Java EE 领域中紧密协作,助力开发者高效构建现代 Web 应用。JSF 凭借其丰富的组件库和页面导航功能受到青睐,而 CDI 则优雅地管理对象生命周期并实现依赖注入。两者结合,不仅简化了复杂企业应用的开发,还实现了松耦合架构,增强了代码的灵活性、可维护性和可扩展性。通过示例展示了如何利用 CDI 将业务服务对象注入 JSF Managed Bean,以及如何在不同页面间共享数据,突显了这一组合的强大功能。
29 0
|
14天前
|
前端开发 API 开发者
JSF与RESTful服务的完美邂逅:如何打造符合现代Web潮流的数据交互新体验
【8月更文挑战第31天】随着互联网技术的发展,RESTful架构风格因其实现简便与无状态特性而在Web服务构建中日益流行。本文探讨如何结合JavaServer Faces (JSF) 和 JAX-RS 构建RESTful API,展示从前端到后端分离的完整解决方案。通过定义资源类、配置 `web.xml` 文件以及使用依赖注入等步骤,演示了在JSF项目中实现RESTful服务的具体过程,为Java开发者提供了实用指南。
25 0
|
14天前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
22 0
|
14天前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
27 0
|
4月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
4月前
|
JavaScript 前端开发 开发者
【TypeScript技术专栏】TypeScript在Angular开发中的应用
【4月更文挑战第30天】本文探讨了TypeScript在Angular开发中的应用。Angular与TypeScript的结合利用了静态类型检查和ECMAScript特性,简化了大型Web应用的开发。文章涵盖组件、数据绑定、依赖注入、服务、守卫和路由以及模块化等方面,展示了如何在Angular中有效使用TypeScript。此外,还提到了TypeScript的高级应用,如泛型、高级类型和装饰器。掌握这些知识将有助于提升Angular应用的可维护性和可扩展性。
47 0