# 16. AngularJS与其它框架的混用(jQuery, Dojo)
这个问题似乎很多人都关心,但是事实是,如果了解了 ng 的工作方式,这本来就不是一个问题了。
在我自己使用 ng 的过程当中,一直是混用 jQuery 的,以前还要加上一个 Dojo 。只要了解每种框架的工作方式,在具体的代码中每个框架都做了什么事,那么整体上控制起来就不会有问题。
回到 ng 上来看,首先对于 jQuery 来说,最开始说提到过,在 DOM 操作部分, ng 与 jQuery 是兼容的,如果没有 jQuery , ng 自己也实现了兼容的部分 API 。
同时,最开始也提到过, ng 的使用最忌讳的一点就是修改 DOM 结构——你应该使用 ng 的模板机制进行数据绑定,以此来控制 DOM 结构,而不是直接操作。换句话来说,在不动 DOM 结构的这个前提之下,你的数据随便怎么改,随便使用哪个框架来控制都是没问题的,到时如有必要使用 `$scope.$digest()` 来通知 ng 一下即可。
下面这个例子,我们使用了 jQuery 中的 _Deferred_ ( `$.ajax` 就是返回一个 _Deferred_ ),还使用了 ng 的 _$timeout_ ,当然是在 ng 的结构之下:
1 <!DOCTYPE html>
2 <html ng-app="Demo">
3 <head>
4 <meta charset="utf-8" />
5 <title>AngularJS</title>
6 </head>
7 <body>
8 9 <div ng-controller="TestCtrl">
10 <span ng-click="go()">{{ a }}</span>
11 </div>
1213 <script type="text/javascript"
14 src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
15 </script>
16 <script type="text/javascript"
17 src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js">
18 </script>
1920 <script type="text/javascript">
21 var app = angular.module('Demo', [], angular.noop);
22 app.controller('TestCtrl', function($scope, $timeout){
23 $scope.a = '点击我开始';
2425 var defer = $.Deferred();
26 var f = function(){
27 if($scope.a == ''){$scope.a = '已停止'; return}
28 defer.done(function(){
29 $scope.a.length < 10 ? $scope.a += '>' : $scope.a = '>';
30 $timeout(f, 100);
31 });
32 }
33 defer.done(function(){$scope.a = '>'; f()});
3435 $scope.go = function(){
36 defer.resolve();
37 $timeout(function(){$scope.a = ''}, 5000);
38 }
39 });
40 </script>
41 </body>
42 </html>
再把 Dojo 加进来看与 DOM 结构相关的例子。之前说过,使用 ng 就最好不要手动修改 DOM 结构,但这里说两点:
1. 对于整个页面,你可以只在局部使用 ng ,不使用 ng 的地方你可以随意控制 DOM 。
1. 如果 DOM 结构有变动,你可以在 DOM 结构定下来之后再初始化 ng 。
下面这个例子使用了 _AngularJS_ , _jQuery_ , _Dojo_ :
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="utf-8" />
5 <title>AngularJS</title>
6 <link rel="stylesheet"
7 href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.1/dijit/themes/claro/claro.css" media="screen" />
8 </head>
9 <body class="claro">
1011 <div ng-controller="TestCtrl" id="test_ctrl">
1213 <p ng-show="!btn_disable">
14 <button ng-click="change()">调用dojo修改按钮</button>
15 </p>
1617 <p id="btn_wrapper">
18 <button data-dojo-type="dijit/form/Button" type="button">{{ a }}</button>
19 </p>
2021 <p>
22 <input ng-model="dialog_text" ng-init="dialog_text='对话框内容'" />
23 <button ng-click="dialog(dialog_text)">显示对话框</button>
24 </p>
2526 <p ng-show="show_edit_text" style="display: none;">
27 <span>需要编辑的内容:</span>
28 <input ng-model="text" />
29 </p>
3031 <div id="editor_wrapper">
32 <div data-dojo-type="dijit/Editor" id="editor"></div>
33 </div>
3435 </div>
363738 <script type="text/javascript"
39 src="http://ajax.googleapis.com/ajax/libs/dojo/1.9.1/dojo/dojo.js">
40 </script>
41 <script type="text/javascript"
42 src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
43 </script>
44 <script type="text/javascript"
45 src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js">
46 </script>
4748 <script type="text/javascript">
4950 require(['dojo/parser', 'dijit/Editor'], function(parser){
51 parser.parse($('#editor_wrapper')[0]).then(function(){
52 var app = angular.module('Demo', [], angular.noop);
5354 app.controller('TestCtrl', function($scope, $timeout){
55 $scope.a = '我是ng, 也是dojo';
56 $scope.show_edit_text = true;
5758 $scope.change = function(){
59 $scope.a = 'DOM结构已经改变(不建议这样做)';
60 require(['dojo/parser', 'dijit/form/Button', 'dojo/domReady!'],
61 function(parser){
62 parser.parse($('#btn_wrapper')[0]);
63 $scope.btn_disable = true;
64 }
65 );
66 }
6768 $scope.dialog = function(text){
69 require(["dijit/Dialog", "dojo/domReady!"], function(Dialog){
70 var dialog = new Dialog({
71 title: "对话框哦",
72 content: text,
73 style: "width: 300px"
74 });
75 dialog.show();
76 });
77 }
7879 require(['dijit/registry'], function(registry){
80 var editor = registry.byId('editor');
81 $scope.$watch('text', function(new_v){
82 editor.setValue(new_v);
83 });
84 });
8586 });
8788 angular.bootstrap(document, ['Demo']);
89 });
9091 });
9293 </script>
94 </body>
95 </html>
- Introduction
- 关于AngularJS
- 关于本文档
- 开始的例子
- 依赖注入
- 作用域
- 数据绑定与模板
- 数据->模板
- 模板->数据
- 数据->模板->数据->模板
- 模板
- 定义模板内容
- 内容渲染控制
- 节点控制
- 事件绑定
- 表单控件
- 模板中的过滤器
- 排序 orderBy
- 过滤列表 filter
- 其它
- 例子:表头排序
- 例子:搜索
- 锚点路由
- 路由定义
- 参数定义
- 业务处理
- 定义模板变量标识标签
- AJAX
- HTTP请求
- 广义回调管理
- 工具函数
- 上下文绑定
- 对象处理
- 类型判定
- 其它服务
- 日志
- 缓存
- 计时器
- 表达式函数化
- 模板单独使用
- 自定义模块和服务
- 模块和服务的概念与关系
- 定义模块
- 定义服务
- 引入模块并使用服务
- 附加模块 ngResource
- 使用引入与整体概念
- 基本定义
- 基本使用
- 定义和使用时的占位量
- 实例
- AngularJS与其它框架的混用(jQuery, Dojo)
- 自定义过滤器
- 自定义指令directive
- 指令的使用
- 指令的执行过程
- 基本的自定义方法
- 属性值类型的自定义
- Compile的细节
- transclude的细节
- 把节点内容作为变量处理的类型
- 指令定义时的参数
- Attributes的细节
- 预定义的 NgModelController
- 预定义的 FormController
- 示例:文本框
- 示例:模板控制语句 for
- 示例:模板控制语句 if/else