最近一直研究angularjs,其双向绑定的确很强大,看中文社区,官方文档,参考github的ui示例,大概摸索下angularjs的开发方式——和传统的dom编程完全不同,jquery再锋利在angularjs的设计理念中,只能作为幕后者。AMD/CMD虽然能和angularjs一起使用,但angularjs自己的module设计,尤其是自动注入特性,比amd/cmd优越。和jquery plugin的扩展方式一样,amd/cmd期望以另一个非官方标准来积累js扩展,angularjs也是如此,开发者要作出选择,或组合或取舍。
?
言归正传:贴下一个简单以cmd形式扩展angularjs指令实现结合jquery/plugin的代码,需要的童鞋可以参考下,照此思路可以把jquery的有用的功能移植到angularjs的应用中来
?
// file ng.config.js define(function(require){ return { init: function(){ // 默认配置 var conf = {}; conf.date = {dateFormat: 'yy-mm-dd'}; conf.autocomplete = {minChars: 3, maxItemsToShow: 20}; var md = angular.module('ng.config', []); md.value('ng.config', conf); } }; }); // file ng.filter.js define(function(require){ return { init: function(){ var md = angular.module('ng.filter', []); // 过滤器方法都会执行两次。。。吐血 // http://stackoverflow.com/questions/11676901/is-this-normal-for-angularjs-filtering // 日期格式转换 md.filter('formatDate', function(){ return function(value, format){ if (!value) return value; return value.format(format || 'yyyy-MM-dd'); }; }); } }; }); // file ng.service.js define(function(require){ return { init: function(){ var md = angular.module('ng.service', []); // 注册服务 // 全局变量获取,一种约定 md.factory('uiGetPageData', ['$window', function(win){ return function(key){ var pageData = win.pageData; return pageData ? pageData[key] : null; }; }]); // 日志 md.factory('uiLog', ['$window', function(win){ return function(msg, level){ if(typeof(msg) != 'string') msg = JSON.stringify(msg); level = level || 'INFO'; if(win.console && win.console.log) win.console.log('[' + level + ']' + msg); }; }]); // 服务请求过滤 md.factory('uiRequest', ['uiLog', function(log){ return { filter: function(params, conf, skipLl){ if(!conf) conf = {dateFormat: 'yyyy-MM-dd'}; var r = {}; if(params){ for(key in params){ if(skipLl && skipLl.contains(key)) continue; var val = params[key]; if(angular.isDate(val)){ r[key] = val.format(conf.dateFormat); }else{ r[key] = val; } } } return r; } }; }]); // 验证服务 md.factory('uiValid', function(){ return { check: function(val, rule){ } }; }); } }; }); // file ng.ui.js define(function(require){ require('ng/ng.config').init(); require('ng/ng.service').init(); require('ng/ng.filter').init(); require('jquery.autocomplete'); require('jquery.bgiframe'); require('jquery.datepicker'); require('jquery.hotkeys'); var ag = window.angular; return { init: function(){ var md = ag.module('ng.ui', ['ng.config', 'ng.service', 'ng.filter']); // 日期选择器 // *** *** *** *** *** *** *** *** *** *** // *** *** *** *** *** *** *** *** *** *** md.directive('uiDate', ['ng.config', 'uiLog', function(conf, log){ 'use strict'; var options = {}; if(ag.isObject(conf.date)){ ag.extend(options, conf.date); } return { restrict: 'A', require: 'ngModel', link: function(scope, el, attrs, ctrl){ var getOptions = function(){ return ag.extend(options, scope.$eval(attrs.uiDate)); }; var init = function(){ var opts = getOptions(); log('Init datepicker : '); log(opts); if(ctrl){ // update model when datepicker value changes var updateModel = function(){ scope.$apply(function(){ var date = el.datepicker("getDate"); ctrl.$setViewValue(date); }); }; if(opts.onSelect){ var userHandler = opts.onSelect; opts.onSelect = function(value, picker){ updateModel(); return userHandler(