相关链接

作用域

  angular 中作用域的概念是一个亮点,由不同的指令、controller等作用域组成的作用域树就是一个app。简单理解一个controller的作用域就是一个$scope,在此controller下的所有指令的操作都是在此作用域下,ng-click,ng-show/hide/if 等指令的表达式计算就是在此作用域下进行的。作用域的层级结构使其具有了继承的特性,形成了作用域链,子作用域可以访问父作用域中的内容。

双向绑定原理

  angular的双向数据绑定是其核心功能。angular 通过监控能事件改变进行绑定;DOM事件(input改变,点击等),XHR的响应触发回调;浏览器地址变化,计时器触发回调等;如果以上情况没有发生,MV改变的可能性不大;当发生了能引起view或model改变的事件时angular就会从根作用域执行脏循环$digest检查,判断是否有需要改变的地方。脏循环会不止一次的执行,以便将所有的model改变集中在一起去改变view,为的是提高性能。

服务

  所谓服务就是一些可以共用的方法、常量等,注册之后可以在需要使用的地方通过名称进行依赖注入.在运行之前可以通过module进行注册服务

 apm = angular.module('apm', ['ngExtend', 'ui.router', 'highcharts-ng']);
//常量 基本页面路径
apm.constant('BASE_PATH', '/asset/views/')
.constant('SUB_ROUTES', 'subroutes/');

  在运行阶段可以通过$provide进行注册,$provide只能在配置阶段注入,所以要在配置阶段保存其引用

 apm.config(function ($stateProvider, BASE_PATH, SUB_ROUTES, $controllerProvider, $filterProvider, $requireProvider, $urlRouterProvider, $provide) {
apm.register = {
controller: $controllerProvider.register,
filter: $filterProvider.register,
factory: $provide.factory
};
//具体使用
apm.register.factory('overview_queryTransactions', function (MyChart, $myhttp, CHART_CONSTANT, $rootScope)

  注册服务的方法比较

  对象种类 可以在配置阶段注入 可以在运行阶段注入
constant 常量值 Y
value 变量值 N Y
service 构造函数创建新对象 N Y
factory 工厂函数返回新对象 N Y
provider $get工厂函数返回新对象 Y N

依赖注入

  angular会将依赖的所有模块上的所有服务混入应用级别的单一命名空间内。所以,模块间可以相互依赖,不同模块间的服务可以相互依赖。这有一个问题就是会存在冲突的可能性。在需要使用的地方根据名称注入。对应的每个名字只存在唯一的服务。我们利用这点可以在依赖某模块的同时去覆盖此模块提供的服务。

  注入服务

 var c = $injector.get(cfg.chartId, cfg.header);

事件传播机制

  angular的事件传播机制类似DOM中的冒泡与捕获的情形。在子级可以通过$scope.$emit 进行事件冒泡,父级可以收到此事件,父级通过$scope.$broadcast进行广播,所有子级可以收到此事件.

            //监听事件
$rootScope.$on(EVENT.MODULE.emit, function (event, data) {
$rootScope.$broadcast(EVENT.MODULE.broadcast, data);
});
//触发事件
$scope.$emit(EVENT.CHANGE_CONDITION.emit, null);

路由

  angular用于开发单页面应用,路由是必不可少的。angular自带路由模块,比较简单的路由需求是可以满足了。存在一些局限。不支持嵌套路由,一个路由只能对应页面中一个区域。当你遇到这些问题的时候,已经有人帮你解决了,ui-router,目前还没遇到过他不支持的功能;

 $urlRouterProvider.when(/^\/?$/, '/app/application/application/application');

        $stateProvider
//固定路径配置示例
//.state('accountsettings', {//账号设置
// url: '/accountsettings',
// templateUrl: BASE_PATH + 'account_settings.html',
// resolve: {
// require: $requireProvider.require('account_settings'),
// }
//})
//默认规则配置
.state('def', {
url: '{url:[^@]*}',//'/{one_code:\\w+}/{two_code:\\w+}/{three_code:\\w+}/{url:[^@]*}',
templateUrl: function ($stateParams) {
var menu = apm.parseURL($stateParams.url), url = BASE_PATH + menu.path;
return addSuffix(url);
},
resolve: {
require: function ($q, $stateParams) {
return resolve($q, $stateParams.url, [getDeps($stateParams.url)]);
}
}
})
//子路由
.state('def.child', {
url: '@/{path:[^/]+}{a1:/?}{p1:[^/]*}{a2:/?}{p2:[^/]*}{a3:/?}{p3:[^/]*}{a4:/?}{p4:[^/]*}{a5:/?}{p5:[^/]*}',
templateUrl: function ($stateParams) {
var url = BASE_PATH + SUB_ROUTES + $stateParams.path;
return addSuffix(url);
},
resolve: {
require: function ($q, $stateParams) {
return resolve($q, $stateParams.path, [SUB_ROUTES + $stateParams.path.split(/[.\?]/)[0]]);
}
}
});
})

  ui-router 跳转带参数的url api

.state('/search', { //搜索
url: '/search?query',
。。。
$state.go('/search',{query:$scope.searchfield});

异步加载

  angular开发单页面应用的时候不可能一次将所有资源全部加载,通常会整合requirejs;

  

//配置路由
$stateProvider.state('index', { //首页
url: '/index',
templateUrl: '/index',
resolve: {
require: $requireProvider.require('index')
}
}) angular.module('ngExtend', ['ng', 'ngCookies']).
provider('$require', function rq() {
/**
* 异步加载配置
* @param deps 如果是单个依赖可以直接写名字,多个依赖使用数组,路径根据require配置
* @returns {*}
*/
this.require = function (deps) {
if (angular.isString(deps)) {
deps = [deps];
}
return ['$rootScope', '$q', function ($rootScope, $q) {
var def = $q.defer();
require(deps, function () {
$rootScope.$apply(function () {
def.resolve();
});
});
return def.promise;
}];
}; this.$get = function () {
return this;
};
}).

  需要手动启动angular

 angular.element(document).ready(function () {
//阻止 # 导航
$(document).delegate('a', 'click', function (event) {
var href = $(this).attr('href');
if (href === '#') {
event.preventDefault();
}
});
angular.bootstrap(document, ['apm']);
});

controller之间相互通信

  • 通过上面的事件传播机制
  • 父作用域数据共享
  • url参数传递

  推荐事件传播以及url传递,url传递参数可以刷新

  

Form验证

   任意元素上(form元素好像不好使)通过ng-form="formname" 指定一个form, 在此元素内的input元素通过指定name属性就可以在绑定到form作用域上
    表单验证,最常使用 ng-minlength,mg-maxlength,ng-pattern="/^\d?$/",表单及单个验证元素上都有 $valid,$invalid,$pristine,$dirty ,select标签 pattern无效,只要选择了option就是验证通过的

 <input type="email" class="form-control" placeholder="" ng-model="condition.email"
name="email"
ng-required="requiredEmail"
ng-class="{'border-red':editform.email.$invalid}" ng-if="isEdit" disabled>

更改插值表达式

myMod.config(function($interpolateProvider){
$interpolateProvider.startSymbol(‘[[’);
$interpolateProvider.endSymbol(‘]]’);
})

表达式

 // 取值 var modelGetter = $parse($ipt.attr('ng-model'));
// 设值 var modelSetter = modelGetter.assign;
//执行 $scope.$eval

动态编译指令

  参考

element.append($compile(html.join(' '))(scope));

测试

测试环境 karma+jasmine 依赖node.js

 
参考 网页:
    karma+jasmine 配置
 
    karma 插件
 
    jasmine
 
 
  1、全局安装karma
       npm install -g karma (有可能提示net framework 没有安装,不用管,安装之后验证一下是否成功karma start)
       npm install -g karma-jasmine 
       npm install -g karma-chrome-launcher
   
   2.jasmine 测试nodejs

angular 零碎的更多相关文章

  1. angular 零碎知识

    各种服务: $location:可以监听事件的改变 link 在没有设置template的情况下,指令作为标签使用的时候,ele是指令(伪数组的形式); * 如果指令作为属性使用的话,ele是使用该指 ...

  2. 从flask视角学习angular(一)整体对比

    写在前面 前端框架完全不懂. 看着angular中文官网的英雄编辑器教程和核心知识,用偷懒的类比法,从flask django的角度 记录一下自己对angular的理解. 作为工科的武曲,自己的体会是 ...

  3. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  4. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

  5. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

  6. angular实现统一的消息服务

    后台API返回的消息怎么显示更优雅,怎么处理才更简洁?看看这个效果怎么样? 自定义指令和服务实现 自定义指令和服务实现消息自动显示在页面的顶部,3秒之后消失 1. 显示消息 这种显示消息的方式是不是有 ...

  7. div实现自适应高度的textarea,实现angular双向绑定

    相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...

  8. Angular企业级开发-AngularJS1.x学习路径

    博客目录 有链接的表明已经完成了,其他的正在建设中. 1.AngularJS简介 2.搭建Angular开发环境 3.Angular MVC实现 4.[Angular项目目录结构] 5.[SPA介绍] ...

  9. Angular企业级开发(4)-ngResource和REST介绍

    一.RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来 ...

随机推荐

  1. Mutual Training for Wannafly Union #6

    A =w= B QvQ C 题意:有长度为n的序列(n<=5e5),求满足条件的a,b,c,d的组数,要求满足条件:min([a,b])<=min([c,d]),a<=b<c& ...

  2. 浅谈SQL Server 对于内存的管理--宋沄剑 英文名:CareySo

    http://www.cnblogs.com/CareySon/archive/2012/08/16/HowSQLServerManageMemory.html

  3. 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

    先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的 ...

  4. 类似于SVN的文档内容差异对比工具winmerge

    原文:http://www.jianshu.com/p/99282a4f3870 https://sourceforge.net/projects/winmerge/?source=typ_redir ...

  5. Lucene.Net 与 盘古分词

    1.关键的一点,Lucene.Net要使用3.0下面的版本号,否则与盘古分词接口不一致. 关键代码例如以下 using System; using System.IO; using System.Co ...

  6. jeewx 微信管家 - 举办商业版本号免费试用活动

    jeewx 微信管家 举办商业版本号免费试用活动 1,关注微信账号:jeecg_scott 2.输入:"jeewx商业版本号试用活动: 你的邮箱(比如:zhangsan@11.com)&qu ...

  7. 『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)

    亲爱的读者们,你们好 !年底将近,分享从过去一年你最喜欢的技巧和建议作为礼物送给新手们.提交你的最喜欢的迅速或objc琐事,实用的提示,意外的发现,实用的解决方法,没用的迷恋,或不论什么其它你认为今年 ...

  8. javaScript 检測 能否够连接指定server

    本文主要讲述怎样在js里面从多个服务端servlet中找到可用的地址 一般项目部署到生产环境之后会有一个生产网段(就是你能够在家訪问)和一个办公网段(仅仅能在公司才干訪问). 我们的项目部署好了之后, ...

  9. Asp.NET之对象学习

    一.总述 二.具体介绍 1.Request对象 Request对象是用来获取client在请求一个页面或传送一个Form时提供的全部信息,这包含可以标识浏览器和用户的HTTP变量,存储在client的 ...

  10. go语言笔记——调试还很弱,用gdb来做?可用panic和defer。格式化代码使用gofmt,貌似我的vim插件是自带

    3.3 调试器 应用程序的开发过程中调试是必不可少的一个环节,因此有一个好的调试器是非常重要的,可惜的是,Go 在这方面的发展还不是很完善.目前可用的调试器是 gdb,最新版均以内置在集成开发环境 L ...