发表于: 2017-02-23 23:13:57

1 1231


一、今天完成的事情:

1.熟悉了rem、em是啥东西,啥时候该用啥;


2.了解到了ng-checked方法,用来做公司福利选项;


3.将模态框封装成了指令,实现了复用;


4.完成了上下线、删除职位的功能;


二、明天要做的事情:

1.彻底完成工作添加、工作编辑;


三、今天遇到的问题:

模态框的指令制作流程:
这里我们说的是基于btui模态框的指令复用性:
1.模态框有一个自己的服务,$uibModle,在这个东西下面有一个open属性,这个属性是一个对象,下面储存了键值对,它有以下几个东西:
animation是否有动画效果,true表示有
templateUrl模板位置
controller模板使用的controller是哪一个(每个模板都会有controller)
size模态框的大小,默认md,对应bt栅格的大小,但是需要这样添加  modal-lg
resolve传入模态框controller中的数据,用于页面渲染和数据操作
result回调函数,触发close之后可以获取到里面的数据,并执行里面的方法
keyboard布尔值,默认为true,可以通过键盘esc关闭模态框
opened class打开时加到body上的class属性
windowclass会附加一个class到打开的模板上面
2.在模态框的controller中,首先要注入$uibModalInstance,这是它模态框专用的依赖,还有上面resolve中传入的数据也需要注入,在$uibModalInstance有几个属性:
close点击正常关闭后触发的事件,可以将值传入$uibModle的result中,需要这样存值$value:xx
dismiss非正常关闭触发的事件


暂时我只了解了以上这么多东西,更多的属性请参考btui官网。
3.思路:项目中要求点击的时候弹出模板,里面有确认和取消两个按钮,当选择成功之后会弹出第二个模态框,提示操作成功。
首先,我们在指令中给ele绑定了点击事件,当点击的时候会触发我页面中获取各种参数的函数,传入各种数据,在这里有个坑,如果用=来绑定指令和controller中的参数的话,参数的传递会有延迟,解决的方法有两个,第一个是将controller中函数你需要的数据最后return出来,在指令中通过"&"绑定,直接将你要传递给指令controller中的值等于这个函数就能解决,我现在也是用的这个方法,还有一个方法就是只用服务来解决,取值的时候取出来存入服务中,取出的时候再从服务中取出,直接使用。用第二种方法需要在两边都把服务都注入,略麻烦。
然后,我们将值传入模态controller中让它渲染页面,因为我这里要显示两个页面,我传入了一个值,来判定我这是第几个页面,第一个页面默认是没有值,第二个是有值,它会根据这个值来渲染页面,下面贴代码:
.directive('useModal',function ($uibModal) {
    return {
        restrict:"A",
        replace:false,
        scope:{
            /*点击确认后执行的函数*/
            ctrFn'&',
            /*获取各种数据的函数*/
            ctrclick:'&',
            /*是否要显示第二段弹出框,没有默认会弹出第二段*/
            modalTwice:"@",
            /*第一次是否有确认按钮,没有就默认弹出会有*/
            okChoose:"@",

        },
        //scope.modaldata中对应三个参数,首先第一个模板默认显示两行,第一行是tilte,第二行是content。第二个模板默认只显示一行,success并且只有一个取消按钮
        link:function (scope,ele) {
            /*给属性添加一个点击事件*/
            ele.bind("click",function () {
                /*执行我那边传入值的函数*/
                scope.modaldata=scope.ctrclick();
                scope.openModle();
            });
            scope.openModle function (size,num) {
                /*打开模态框的过程*/
                var modalInstance $uibModal.open({
                    animationtrue,
                    templateUrl'tpls/modaltpls/test.html',//模态框的页面内容,这里的url是可以自己定义的,也就意味着什么都可以写
                    controller'ModalInstanceCtrl',//这是模态框的控制器,是用来控制模态框的
                    sizesize,//模态框的大小尺寸
                    resolve{//这是一个入参,这个很重要,它可以把主控制器中的参数传到模态框控制器中
                        itemsfunction () {//items是一个回调函数,我这里需要让它在外部获取到
                            scope.modaldata.num num?1:false
                            scope.modaldata.okChoose scope.okChoose?2:1;
                            return scope.modaldata;//这个值会被模态框的控制器获取到
                        }
                    }
                });
                modalInstance.result.then(function () {
                    scope.ctrFn();
                    scope.modalTwice?false:scope.openModle(size,1)
                })
            }
        }
    }
})
为了复用性,我加入了两个参数,这两个参数能够控制我页面如何渲染,但是还存在着一个小bug,我不管操作是成功还是失败,都会弹出成功的框,因为这边第二个框是直接调用,并不是在上一个的then.中调用



关于rem和em的思考:

1.首先,你要知道em这个表示宽度,是通过使用em的这个元素的font-size来确定,我们都知道,font-size属性是可以继承的,比如你父元素设置的10px,你给父元素下的一个元素设置0.5em这个元素就变成了5px。但是这种继承的情况会在它有多个层级的时候变得特别复杂,来一个小demo

<div style="font-size20px">我是父级元素
   <div style="font-size2em">我是子元素,我的字体大小是20*2=40px
<div style="font-size2em">我是子元素下的元素,我的字体大小是40*2=80</div>
   </div>
</div>
2.rem的大小是根据html根元素来确定的,比如我给html设置font-size=10px,那我1rem=10*10=100px。
3.现在我们还需要知道浏览器有个默认字体大小的设定,比如谷歌浏览器,可以在设置中设置最小9px最大79px的初始字体大小。我们刚刚有说到rem是根据html根元素来设置像素的,所以我们在使用rem时,无形中使用了用户偏好。
4.所以我们应该在标识清楚的情况下使用em单位,也就是说能很明确它的父元素的font-size是多少,再使用,这样才不会导致继承到后面无法确定具体的数值,也就是说em最好只用在比如导航、下拉菜单之类的控件中,因为只需要给它的父级设定一个font-size,下面的元素就能够跟着变化。

5.什么时候不要使用rem、em:多列布局,因为多列布局最好使用百分比来表明他们的高度宽度,这样浏览器才能够更好的进行自适应,当然,在单列的情况下还是推荐使用rem的,或者是改变字体的大小必然会改变布局的情况,这种也必须给它写死了


一些小的想法:

1.删除的操作后面只能跟id;
2.0的隐式转换会把它转为false(踩了很多次的坑);
3.时刻注意命名,有冲突很尴尬;
4.在bt中,要禁用表单输入框,可以使用disabled加在表单的最后面禁用表单,也可以使用<fieldset disabled>标签来禁用整张表单
5.获取职位tag的想法,获取到所有的职位信息,然后打印到页面中去,从服务器上获取到的公司数据,放入一个数据。获取到的本职位数据放入一个数组,true和false根据判断数组中是否有这个值来判定,



返回列表 返回列表
评论

    分享到