ng-init设置默认选中值。
<body ng-app ng-init="msg='hello'">
<div id="app">
<input type="text" ng-model="msg">
<p>{{msg}}</p>
</div>
</body>
废弃声明 (v1.5)
v1.5 中$http 的 success 和 error 方法已废弃。使用 then 方法替代。
app.controller('customersCtrl', function($scope, $http) {
$http.get("/try/angularjs/data/Customers_JSON.php")
.then(function (result) {
$scope.names = result.data.records;
});
});
例子如下:
$http.get('/api/user/showname', {
params: {
name: '张三'
}
}).success(function (data, status, config, headers) {
console.info(data);
alert(data);
}).error(function (data) {
console.info(data);
});
V1.5正确写法:
$http.get('/api/user/showname2', {
params: {
name: '张三',
age: 'abc'
}
}).then(function (result) { //正确请求成功时处理
console.info(result);
alert(result.data);
}).catch(function (result) { //捕捉错误处理
console.info(result);
alert(result.data.Message);
});
ng-hide,ng-show显示,隐藏元素
form表单
<form>
选择一个选项:
<input type="radio" ng-model="myVar" value="dogs">Dogs
<input type="radio" ng-model="myVar" value="tuts">Tutorials
<input type="radio" ng-model="myVar" value="cars">Cars
</form>
<div ng-switch="myVar">
<div ng-switch-when="dogs">
<h1>Dogs</h1>
<p>Welcome to a world of dogs.</p>
</div>
<div ng-switch-when="tuts">
<h1>Tutorials</h1>
<p>Learn from examples.</p>
</div>
<div ng-switch-when="cars">
<h1>Cars</h1>
<p>Read about cars.</p>
</div>
</div>
表单验证:
<input type="text" name="user" ng-model="user" required>
<span style="color:red" ng-show="myForm.user.$dirty && myForm.user.$invalid">
<span ng-show="myForm.user.$error.required">用户名是必须的。</span>
</span>
<input type="submit"
ng-disabled="myForm.user.$dirty && myForm.user.$invalid ||
myForm.email.$dirty && myForm.email.$invalid">
一个完整的 Web 开发框架(ASP.NET)
一对一:
public class CarMap : ClassMap<Car>
{
public CarMap()
{
Table( "Vehicles.dbo.Car" );
Id( x => x.CarId );
Map( x => x.Name );
Map( x => x.Year );
HasOne( x => x.SteeringWheel ).PropertyRef( x => x.Car);//表达当前主键关联对应表关联字段
}
}
public class SteeringWheelMap : ClassMap<SteeringWheel>
{
public SteeringWheelMap()
{
Table( "Vehicles.dbo.SteeringWheel" );
Id( x => x.SteeringWheelId );
Map( x => x.Diameter );
Map( x => x.Color );
References( x => x.Car, "CarId" ).Unique();
}
}
多对一:
public class Book
{
public Author Author { get; set; }
//书对应作者,多对一关系
1.References(o => o.Author);//这个配置表示两张表是主键关联,如果是非主键关联可用如下如下配置方式:
2.References<Author>(o => o.Author).Column("当前表关联字段名").PropertyRef(o => o.CODE);//Lamda表达方式
3.References<Author>(o => o.Author).Column("当前表关联字段名").PropertyRef("对应表关联字段名");
总结:Column :表示主表关联字段的值,如果是主键关联可以不用配置;PropertyRef:表示对应表关联的字段名,如果是主键关联不用配置。
}
public class Author
{
public IList<Book> Books { get; set; }
}
一对多:
HasMany<Task_Audits>(o => o.Audits)
.AsSet()
.KeyColumn("TASKOID")
.Cascade.All();
多对多:
HasManyToMany<Base_OrgInfo>(o => o.Orgs)
.AsSet()
.ParentKeyColumn("UserId")
.ChildKeyColumn("OrgId")
.Table("Base_Relation_UserOrg");//.Cascade.All();
命名规范:
ExtJS类名:首字母大写,驼峰命名。
2、Js方法名:首字母大写,驼峰命名。
3、Js变量:首字母小写,驼峰命名。
4、命名空间:根命名空间首字母大写,驼峰命名。其余的首字母小写,驼峰命名。
5、代码缩进:javascript中,“{}”缩进方式:前花括号“{”不换行,后花括号“}”换行。其余代码每次缩进4个英文字符。
form表单控件自定义验证:
xtype: 'textfield', //可以是任何form控件
validator: function (value) { //value当前控件值
var me = this;
var valid = false;
/// 在此添加自定义验证
/// 验证成功 valid=true;
/// 验证失败 valid='错误信息';
return valid;
}
angular js
ng-if 和ng-show,ng-hide:
ng-if 在后面表达式为 true 的时候才创建这个 dom 节点,ng-show 是初始时就创建了,用 display:block 和 display:none 来控制显示和不显示
其实,并不是只有 Controller 可以创建作用域,ng-if 等指令也会(隐式地)产生新作用域。
总结下来就是,ng-if、 ng-switch 、 ng-include 等会动态创建一块界面的东西,都是自带一级作用域。
因此,在开发过程中,为了避免模板中的变量歧义,应当尽可能使用命名限定,比如 data.x(form.name),出现歧义的可能性就比单独的 x 要少得多。
总结:始终将页面中的元素绑定到对象的属性(data.x)而不是 直接绑定到基本变量(x)上。
SERVICE,FACTORY,PROVIDER:
service 调用了 factory,返回其实例;factory 调用了 provider,返回其 $get 中定义的内容。factory 和 service 功能类似,只不过 factory 是普通 function,可以返回任何东西(return 的都可以被访问,所以那些私有变量怎么写,你懂的);service 是构造器,可以不返回(绑定到 this 的都可以被访问);
provider 是加强版 factory,返回一个可配置的 factory。
angular 的数据绑定采用脏检查机制。
只有当UI事件,ajax请求或者 timeout 延迟事件,才会触发脏检查(比较UI和后台的数据是否一致!)。
调用scope.$apply函数,它是触发Angular“脏检查机制”的常用公开接口。
function safeApply(scope, fn){
(scope.phase||scope.$root.phase) ? fn() : scope.$apply(fn);
}
0830学习
angularjs模块只保留服务的声明,服务的实例化是由服务注入器完成的,实例化之后服务就留在了服务注入器中。
(注入就是实现实例化)
注入器的机制就是当我们需要某个服务的时候,首先根据服务名找到对应的服务提供商,然后由服务提供商创建对应的服务并返回。
整个过程:
1模块定义服务、服务提供商;
2注入器根据模块依赖关系加载模块,实例化所有服务提供商;
3应用需要服务,注入器根据服务名寻找服务提供商,服务提供商实例化服务。
angularJS以什么样的方式执行我们定义的服务?指令,变量
什么才会是在config()的时候被执行的呢,换句话说是这样的东西能够被注入到config里面呢?提供者 和常量
function routesConfig($stateProvider, $locationProvider, $urlRouterProvider, helper)
通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素:
$("#hide").click(function(){
$("p").hide();
});
$("#show").click(function(){
$("p").show();
});
Angularjs $location html5mode
如果 $locationProvider.html5Mode 设置为true,在加载入口文件之后,地址栏会变为 http://hostname/love,而不是http://hostname/#/love。但是存在一个问题,后者可以直接访问,前者也许能访问,也许不能,但不会出现预期的结果,典型结果就是NG中文API站,
每次向在新页面打开某个链接,结果就是华丽丽的报错,例如:http://docs.angularjs.cn/api,所以需要做重定向:
app.get('/love', function(req, res) {
res.sendFile(path.join(__dirname, 'static/index.html'));
});
路由 抽象状态 abstract 详解
一个抽象的状态可以有子状态但不能显式激活,它将被隐性激活当其子状态被激活时。
用处:
1.在父状态中设置template属性,子状态对应的模板将插入到父状态模板中的ui-view(s)中
.state('AuditsManage', {
abstract: true,
url: '/AuditsManage',
title: '审核管理',
resolve: helper.resolveFor('fastclick', 'modernizr', 'icons', 'screenfull', 'animo', 'ngTable', 'ngDialog',
'sparklines', 'slimscroll', 'classyloader', 'toaster', 'whirl', 'oitozero.ngSweetAlert'),
views: {
'content': { //index.html页面的
//<section ui-view="content" >
//</section>
//ui-view的名称,嵌套模块的名称,在另一个页面子模块的templateUrl的页面会是这个ui-view的内容(相当于框架的内容不需要全部写在同一个html页面,使用路由就可以实现多个html绑定在一个浏览器页面一个HTML嵌套显示)
//框架结构
template: '<div data-ui-view="" autoscroll="false" ng-class="app.viewAnimation" class="content-wrapper"></div>'
//父标签的template
}
}
})
.state('AuditsManage.TaskAudits', {
url: '/TaskAudits',
title: '审核',
templateUrl: '/view/auditsmanage/taskaudits.html', //子模块对应的的模板
resolve: ['$ocLazyLoad', function ($ocLazyLoad) {
return $ocLazyLoad.load([{
files: [
'/Scripts/Vendor/angular-sweetalert/SweetAlert.js',
'/Scripts/App/Modules/common/sweetalert.min.js',
'/Scripts/App/Modules/common/jquery-ui.min.js',
'/Scripts/app/modules/auditsmanage/taskaudits.controller.js',
'/Scripts/app/modules/common/potting.table.directive.js',
'/Scripts/app/modules/common/common.buttonsmenu.directive.js']
}])
}]
})
2.通过resolve属性,为所有子状态提供解决依赖项
3.通过data属性,为所有子状态或者事件监听函数提供自定义数据
4.运行onEnter或onExit函数,这些函数可能在以某种方式修改应用程序。
注:抽象的状态模板仍然需要,来让自己的子状态模板插入其中。因此,如果您使用抽象状态只是为了预提供基url、提供解决依赖项或者自定义data、运行onEnter/Exit函数,你任然需要设置template: ""。