angularJS关于依赖和模块与amd/cmd的区别,分享下结合使用示例

 我来答
栋暖殊T1
2015-08-01 · TA获得超过3297个赞
知道大有可为答主
回答量:2221
采纳率:0%
帮助的人:1221万
展开全部

双向绑定,可测试性的代码结构,模型视图分离的一个前端MV*框架

其中angular也提供了模型的概念和依赖管理,不过这个依赖都是要在js对象都已经定义的前提下,没有像amd/cmd提供按需加载。

我个人比较喜欢cmd(seajs),它对顶级作用域window的使用约束较多,全局对象和方法少,缺点就是很多原生库,都需要手工wrap下。

angular定义的controller一般都是全局的,我想用seajs来管理angular的代码和依赖,下面是一起使用的示例,有类似需求的童鞋可以参考下:

// file ng_module2.js
define(function(require){
var Log = require('log');
return {
init: function(){
Log.w('Load angular module : m2');

var ag = window.angular;
if(!ag){
Log.w('Error when load angular module : m2 : no angular');
return;
}

var m2 = ag.module('m2', []);
m2.filter('greet', function(){
return function(name) {
return 'Hello, ' + name + '!';
};
});
}
};
});
// file ng_module1.js
define(function(require){
require('module/demo/ng_module2').init();
var Log = require('log');

return {
init: function(){
Log.w('Load angular module : m1');

var ag = window.angular;
if(!ag){
Log.w('Error when load angular module : m1 : no angular');
return;
}

var m1 = ag.module('m1', ['m2']);
m1.directive('testDateFormat', function(){
return function(scope, el, attrs, ctrl){
var format = 'yyyy-MM-dd';
var updateTime = function(){
el.text(new Date().format(format));
};

// watch scope.format in ctrl
scope.$watch('format', function(value){
format = value;
updateTime();
});

updateTime();
}
});
}
};
});
// file demo/ng1.js
// 初始化页面 
define(function(require){
var Log = require('log');

require('module/demo/ng_module1').init();
var agAdaptor = require('x/x.ex.angular');

return {
initPage: function(from, pageInfo, params){
var TestCtrl = function($scope){
$scope.format = 'yyyy/MM/dd';
};
window.TestCtrl = TestCtrl;

agAdaptor.init(['m1'], 'TestCtrl', 'ngContext');
}, 

dump : '' 
};
});
// file x/x.ex.angular.js
// angular bootstrap适配——在bootstrap之前动态修改下dom
define(function(require){
var $ = require('jquery');
var Log = require('log');

return {
init: function(modules, ctrlName, contextId){
if(!window.angular){
Log.w('No angluar defined!', 'WARN');
return;
}

var _context = $('#' + contextId);
this.initCtrl(_context, ctrlName);
this.initModel(_context);
this.bootstrapAngular(modules);
},

// 把ng-controller补上
initCtrl: function(_context, ctrlName){
if(ctrlName)
_context.attr('ng-controller', ctrlName);
}, 

// 根据name把ng-model补上
initModel: function(_context){
_context.find('[name^=f_]').each(function(){
var _el = $(this);
var name = _el.attr('name');
var modelName = name.split('_').remove(0).join('.');
_el.attr('ng-model', modelName);
});
},

bootstrapAngular: function(modules){
window.angular.bootstrap(document, modules);
}
};
});
	<div class="m_10">
<h3>Angular——Work with SeaJS</h3>

<div id="ngContext">
Date format: <input ng-model="format"> 
<br />
Current time is: <span test-date-format=""></span>
</div>
</div>

seajs.use('module/demo/ng1', function(IPage){
IPage.initPage();
});
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式