关于seajs模块间相互依赖调用的解耦问题
前端密集型项目中如果数据同步的量很大,往往需要对于多个组件进行数据同步,其中必会导致几个组件之间的互相依赖调用,在seajs中递归嵌套的调用组件会引起循环引用导致内存泄露。
?
比如有这样两个模块组件:
?
//@file : module/buddy/friend-in-group/friend-in-group.jsdefine(function(require, exports, module){var $ = require('lib/jquery.js'),_ = require('lib/underscore.js'),fmw = require('module/buddy/friend-in-group/friend-middleware'),friend = require('module/buddy/add-friend/add-friend');var _addFriend = function(){// Some logic here};var _removeFriend = function(uid){// Some logic here};var subscribeEvent = function(){fmw.subscribe('add',function(data,arg){// Some logic here_addFriend(uid,false);},[currentGroupId]);fmw.subscribe('remove',function(data,arg){// Some logic here_removeFriend(uid);},[currentGroupId]);}exports.init = function(){subscribeEvent();friend.add();}});?
?
如上面的代码便可以进行方法的注入与方法的触发,在friend-in-group中注册add和remove的方法事件,在add-friend中进行方法事件的触发。在subscribeEvent方法中将匿名方法传递到了中间件模块中,这个匿名函数在arg中保存了注册组件方的传入数据,而参数data
则是触发模块方的传入参数,在注册模块方引用该模块的私有函数,相当于将这个匿名函数的闭包作用范围扩展到了注册模块内部。这样在触发事件时便可保留触发时注册模块的一切被外引用状态。起到了解耦的效果。
?
1 楼 lifesinger 2012-07-11 升级到 seajs 1.2.0 可以有效解决这个问题。