`

angularjs跨window controller互操作的方法

 
阅读更多

项目中有跨window的相互交互的场景,不适合用模态窗口做。通过指令很容易满足该需求。

具体思路:在window1的一个element上使用jquery的事件绑定,在指令里回调scope的属性或方法。

window2就在需要回调的方法里去触发window1的element的事件。

 

具体实现代码如下:

 

define(function(require){
	var moduleName = 'ng.ext.trigger-bridge';
	return {
		init: function(){
			window.console.log('Begin init module ' + moduleName);
			if(angular.isModuleExists && angular.isModuleExists(moduleName)){
				window.console.log('Module already exists!' + moduleName);
				return;
			}

			var md = angular.module(moduleName, []);

			md.factory('extTriggerBridgeService', function(){
				return {
					trigger: function(el, type, field, data){
						el.trigger(type || 'scopeChange', [field, data]);
					}, 

					triggerInWindow: function(win, elementId, type, field, data){
						// cross window, use jquery not jqLite in global
						if(win && win.$){
							var elDom = win.document.getElementById(elementId);
							win.$(elDom).trigger(type || 'scopeChange', [field, data]);
						}
					}
				};
			});

			// *** *** *** *** *** *** *** *** *** ***
			// *** *** *** *** *** *** *** *** *** ***
			md.directive('extTriggerBridge', ['$parse', function($parse){
				'use strict';

				return {
					restrict: 'A',

// begin link ***
link: function(scope, el, attrs, ctrl){
	var opts = scope.$eval(attrs.extTriggerBridge) || {};
	console.log('Init extTriggerBridge - ' + JSON.stringify(opts));

	el.bind(opts.eventType || 'scopeChange', function(e, field, data){
		console.log('Trigger : '  + JSON.stringify(opts) + ' - ' + 
			field + 
			' - ' + 
			JSON.stringify(data));
		if(opts.setData){
			// set data
			if(data){
				var getter = $parse(field);
				var setter = getter.assign;

				var oldVal = getter(scope) || {};
				angular.extend(oldVal, data);
				scope.$apply(function(){
					setter(scope, oldVal);
				});
			}
		}else if(opts.callFn){
			// call function
			var fnTarget = $parse(field)(scope);
			if(!fnTarget || !angular.isFunction(fnTarget)){
				console.log('No function defined : ' + field);
			}else{
				scope.$apply(function(){
					fnTarget(data);
				});
			}
		}else{
			// emit event
			var eventName = field;
			scope.$apply(function(){
				scope.$emit(eventName, data);
			});
		}
	}); 
}
// end link ***

				}; // end link
			}]); // end directive
		} // end init
	};
});

 

 

0
4
分享到:
评论

相关推荐

    详解AngularJS之$window窗口对象

    下面的代码展示了如何使用AngularJS和$window服务来监听窗口大小变化并执行相应操作: ```html <!DOCTYPE html> <title>Title <script src="angular.js"></script> var app = angular.module('myApp', [])...

    Angularjs中controller的三种写法分享

    angularjs中controller其实就是一个方法,它有三种写法,下面来一起看看吧。 第一种: <pre name=code class=javascript>var AppController = ['$scope', function($scope){ $scope.notifyServiceOnChage = ...

    最新AngularJS开发宝典视频教程 后盾网AngularJS培训视频教程 后盾网.txt

    ├最新AngularJS开发宝典—第063讲 $window服务的实例讲解.mp4 ├最新AngularJS开发宝典—第064讲 $sce服务安全的处理html数据.mp4 ├最新AngularJS开发宝典—第065讲 $cacheFactory的缓存实例讲解.mp4 ├最新...

    JavaScript bom操作 window对象的方法 示例代码

    JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 ...

    WebBrowser_js与托管代码互操作

    这种交互被称为“WebBrowser_js与托管代码互操作”,它允许用户在浏览器控件内执行本地应用程序的功能,或者反之,让本地应用对网页进行操作。下面将详细介绍这一主题,包括原理、实现方法以及相关的技术要点。 1. ...

    window对象的常用方法和作用

    在JavaScript中,所有的全局变量和函数都是window对象的属性和方法。本篇将详细阐述window对象的一些常用方法及其作用。 1. **open方法** `window.open(URL, 窗口名称, 窗口风格)` 用于打开新的浏览器窗口。`URL`...

    AngularJS开发下一代WEB应用

    AngularJS通过它的内置服务$injector,能够自动注入$scope、$location、$window以及其他自定义的Service。依赖注入机制主要用在controller和factory中。依赖注入不仅减少了代码的耦合性,还提高了模块的复用性。 ...

    angularbaidumaps百度地图AngularJs指令示例

    这是一个专门为AngularJS设计的百度地图指令集,它允许开发者轻松地在AngularJS应用中嵌入和操作百度地图。下面将详细介绍其核心概念、使用方法以及示例。 **1. 安装与引入** 首先,你需要通过npm或者GitHub下载...

    angular-post-message:允许angularJS通过window.postMessage API侦听和发布跨文档消息

    AngularJS postMessage API 允许angularJS通过 API侦听和发布跨文档消息。 跨文档消息传递与以下浏览器兼容,如“: Internet Explorer 8+ Firefox 3+ Chrome4+ Safari 4+ Opera 9.5+ iOS Safari 3.2以上版本Opera ...

    重写window.alert方法

    在JavaScript中,对象的方法是可以被替换的,因此我们可以在全局作用域内定义一个新的`alert`函数,让它执行我们自定义的操作。以下是一个简单的例子: ```javascript (function() { var originalAlert = window....

    使用angularjs实现浮动表单效果.zip

    app.controller('FormController', function($scope, $window) { var formElement = angular.element(document.querySelector('form')); var handleScroll = function() { $scope.isFixed = $window....

    AngularJS封装jQuery Datepicker

    因此,在封装过程中应尽可能减少DOM操作,使用AngularJS提供的原生服务和指令,以提高应用的性能和可维护性。 总结,AngularJS封装jQuery Datepicker是将两者的优势结合,利用AngularJS的双向数据绑定和指令系统,...

    jsWindow对象及方法.pdf

    根据提供的文件信息,这是一篇关于JavaScript中的window对象及其方法的文档。window对象是Web浏览器中的一个全局对象,它代表了浏览器窗口本身,是JavaScript中的最顶级对象。以下是关于window对象及其相关方法的...

    window属性和方法

    这里面包含了window的所有方法和属性的基本用法,特别适合初学者学习bom

    Angularjs的启动过程分析

    这些方法和属性为AngularJS提供了丰富的功能,如元素操作、数据处理等。自执行函数中还包含一个循环,用以遍历angular全局对象的所有属性,并输出它们的类型和值。通过输出可以发现,除了两个属性之外,其余的都是...

    window对象方法属性全解

    Window对象在Web开发中扮演着至关重要的角色,它是JavaScript中全局对象的一个实例,几乎所有的其他...通过结合其他JavaScript技术,如DOM操作、AJAX通信等,Window对象能够成为构建强大交互式Web应用的强大工具。

    javascript弹出窗口 window.open使用方法以及参数说明分析篇

    window.open使用方法以及参数说明一、window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二、基本语法: window.open(pageURL,name,parameters) 其中: pageURL 为子窗口路径 name 为子窗口...

    angularjs 页面自适应高度的方法

    本文将详细介绍两种在AngularJS中实现页面自适应高度的方法。 ### 方法一:使用自定义指令(autoHeight) 自定义`autoHeight`指令是通过在UI-Router的`ui-view`所在的`div`元素上添加该指令来实现的。首先,我们需要...

Global site tag (gtag.js) - Google Analytics