控制器 - Julienedies/brick GitHub Wiki
控制器本质就是一个函数。作用的话比较像mvc里的c。定义一个控制器的同时,也即声明了一个作用域对象。该作用域对象在控制器初始化时作为实参被注入,对应于形参scope。使用brick.controllers.reg
方法定义并注册一个控制器。控制器的定义需要必须的两个参数,控制器id,控制器初始化函数,可选的控制器配置。例如:
brick.controllers.reg('demoCtrl',function(scope, stocksModel){
},{depend:['stocksModel']});
以上的代码定义了一个id为demoCtrl的控制器,可选的第三个参数声明了该控制器依赖的服务。声明的依赖服务会在控制器初始化时,紧接着scope作为实参被传入。
控制器通过ic-ctrl指令关联到一个dom元素上。在作用域对象scope上添加的属性和方法,可以被该dom元素及其子元素上绑定的指令使用。 例如:
<div ic-ctrl="demoCtrl">
<input type="text" ic-on-enter-press="enter">
<div ic-ctrl="subCtrl">
<input type="text" ic-on-enter-press="enter">
</div>
</div>
<script>
brick.controllers.reg('demoCtrl', function(scope){
scope.enter = function(){
alert(1);
}
});
<script>
以上代码中html部分里的input元素通过自定义的ic-on-enter-press属性绑定了ic-on-enter-press指令,顾名思义,ic-on-enter-press表示当回车键按下,属性值enter指向domeCtrl控制器中绑定到scope上的enter函数。
控制器的作用域对象会按照绑定ic-ctrl指令的dom元素的层次结构一样,具有继承性。假如上面的代码改为:
<div ic-ctrl="demoCtrl">
<input type="text" ic-on-enter-press="enter">
<div ic-ctrl="subCtrl">
<input type="text" ic-on-enter-press="enter">
</div>
</div>
<script>
brick.controllers.reg('demoCtrl', function(scope){
scope.enter = function(){
alert(1);
}
});
brick.controllers.reg('subCtrl', function(scope){
});
<script>
虽然subCtrl控制器中没有定义enter函数,但是因为作用域对象会按照dom层次具有继承性,第二个input的ic-on-enter-press属性值enter会按照原型继承链找到demoCtrl控制器中作用域对象的enter函数。
在控制器初始化函数中,scope.$elm引用到ic-ctrl指令关联的dom元素。
通过作用域对象的原型链继承特性,实现公共属性和方法的共享。