Model:数据模型层
View:视图层,负责展示
Controller:控制器,控制逻辑
一切从模块开始
angular.module(name, [requires], [configFn]);
name:字符串类型,代表模块的名称;
requires:字符串的数组,代表该模块依赖的其他模块列表,如果不依赖其他模块,用空数组即可
configFn:用来对该模块进行一些配置。
通过模块创建控制器
angular.module('appModule').controller('appCtrl',function(){});
<div ng-controller="ctrl"></div>
angular.module('appModule').controller('appCtrl',function($scope){});
当前作用域$scope,$scope就是viewModel
我们想使用$scope和$rootScope可以注入进来(名字是固定的)
angular.module('appModule').controller('appCtrl',function($scope,$rootScope){});
通常情况下我们会将$rootScope上的代码提取声明
app.run(function($rootScope){});
通过压缩工具压缩代码后$scope等名称改变报错
app.controller('appCtrl',['$scope',function ($s) {
$s.name = 'zfpx';
}]);
md.run(["$rootScope",function($s){
$s.name = 'zfpx';
}]);
页面代码
<div ng-controller="appCtrl">
+ <input type="text" ng-model="name">
</div>
app.controller('appCtrl',['$scope',function ($s) {
+ $s.$watch('name', function (newVal,oldVal) {
+ console.log(newVal,oldVal);
+ })
}]);
app.controller('appCtrl',['$scope',function ($s) {
$s.$watch(function () {
return $s.name;
}, function (newVal,oldVal) {
console.log(newVal,oldVal);
});
}]);
页面代码
<div ng-controller="appCtrl">
<input type="text" ng-model="val1">
+
<input type="text" ng-model="val2">
{{total()}}
</div>
控制器
app.controller('appCtrl',['$scope',function ($s) {
$s.total = function () {
return $s.val1+$s.val2;
};
$s.$watch($s.total, function (newVal,oldVal) {
console.log(newVal,oldVal);
})
}]);
页面代码
<div ng-controller="appCtrl">
{{name}}
</div>
控制器
app.controller('appCtrl',['$scope',function ($s) {
$s.name = 1;
setInterval(function () {
$s.name++
},1000)
}]);
通知方式1:
app.controller('appCtrl',['$scope','$interval',function ($s,$interval) {
$s.name = 1;
setInterval(function () {
$s.name++;
$s.$apply();
},1000);
}]);
通知方式2:
app.controller('appCtrl',['$scope','$interval',function ($s,$interval) {
$s.name = 1;
setInterval(function () {
$s.$apply(function(){
$s.name++;
});
},1000);
}]);
app.controller('appCtrl',['$scope','$timeout',function ($s,$timeout) {
$s.name = 1;
$timeout(function () {
$s.name++;
},1000);
}]);
app.controller('appCtrl',['$scope','$interval',function ($s,$interval) {
$s.name = 1;
$interval(function () {
$s.name++;
},1000);
}]);
app.controller('appCtrl',['$scope','$interval',function ($s,$interval) {
$s.name = 1;
var timer = $interval(function () {
$s.name++;
$interval.cancel(timer);
},1000);
}]);
已经是angular自带的指令就不要在调用$apply去通知了
表达式生效前不要加载该资源,防止空链接
<a ng-href="{{ myHref }}">baidu</a>
var app = angular.module('appModule',[]);
app.controller('appCtrl',function ($scope,$timeout) {
$timeout(function () {
$scope.myHref = 'http://www.baidu.com';
},20000)
})
表达式生效前不引用该资源,防止出现404
<img ng-src="{{imgSrc}}"/>
var app = angular.module('appModule',[]);
app.controller('appCtrl',function ($scope,$timeout) {
$timeout(function() {
$scope.imgSrc = 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png';
}, 1000);
});
控制器间的交互是通过事件进行监听的
<div ng-controller="parentCtrl">
商品总价 <input type="text" ng-model="total">
<div ng-controller="childCtrl">
商品的名称 {{product.name}} <br>
商品的单价 {{product.price}} <br>
商品的数量 <input type="text" ng-model="product.count" ng-change="total()">
</div>
</div>
子控制器代码
app.controller('childCtrl', function ($scope) {
$scope.product = {name:'火车', price:10,count:1}
});
父控制器代码
app.controller('parentCtrl', function ($scope) {
$scope.total = 10;
});
修改子控制器代码,当数量变化时通知父控制器
$scope.product = {name:'火车', price:10,count:1}
+ $scope.total = function () {
+ $scope.$emit('total',$scope.product.price*$scope.product.count);
+ };
监听子控制器发射的事件
$scope.total = 10;
+ $scope.$on('total', function (ev,data) {
+ $scope.total = data;
+ });
当总价改变,向下通知所有子控制器
+ $scope.$watch('total', function () {
+ $scope.$broadcast('count',$scope.total);
+ });
子控制器接收父控制器广播的内容
$scope.$on('count', function (ev,data) {
$scope.product.count = data/$scope.product.price;
});
当表单元素被设置disabled属性为true时元素不可用
<button ng-disabled='true'>点击</button>
当表单元素被设置readonly属性为true时元素仅读
<input type="text" ng-readonly="true" value="仅读"/>
用id的值作为value,以name值作为可见参数去数据中遍历
<select ng-model="name" ng-options="t.id as t.name for t in type"></select>
定义select中的数据
app.controller('appCtrl',['$scope','$interval',function ($s,$interval) {
$s.type = [{name:'人类',id:1},{name:'动物',id:2},{name:'动物',id:3}]
}]);
创建第一个模块
var app = angular.module('appModule1',[]);
app.controller('appCtrl', function ($scope,$interval) {
$scope.name = 20;
});
创建第二个模块并依赖第一个模块
var app1 = angular.module('appModule2',['appModule1']);
app1.controller('appCtrl', function ($scope,$interval) {
$scope.name = 1;
});
被依赖的同名控制器会被覆盖掉
将不同的模块应用到不同的div上,达到启动多个ng-app的效果
<div ng-controller="appCtrl" id="div1">{{name}}</div>
<div ng-controller="appCtrl" id="div2">{{name}}</div>
var app1 = angular.module('appModule2',[]);
app1.controller('appCtrl', function ($scope,$interval) {
$scope.name = 'zfpx';
});
var app = angular.module('appModule1',[]);
app.controller('appCtrl', function ($scope,$interval) {
$scope.name = 'home';
});
angular.bootstrap(div1,['appModule1']);
angular.bootstrap(div2,['appModule2']);