angularjs学习心得

1.在使用Angular Material对话框时,对话框显示以后,点击浏览器的返回按钮对话框不会消失的问题,解决方法就是监听$stateChangeStart事件,如果对话框已经显示则取消对话框并阻止下一步事件,如果有panel对话框需要先关闭掉panel对话框,自己在$mdPanel的Controller中绑定panelClose事件,$scope.on('panelClose',function(){mdPanelRef.close();})

.run(['$rootScope', '$state', '$stateParams', 'SessionStorage', 'ENV', '$mdDialog', '$document',
        function ($rootScope, $state, $stateParams, SessionStorage, ENV, $mdDialog, $document) {
            //监听stateChange事件
            $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
                if(angular.element($document[0].body).hasClass('md-dialog-is-showing')) {//如果有对话框存在
                    $mdDialog.cancel();
                    event.preventDefault();
                    return;
                }
                if(angular.element('.md-panel-is-showing').length>0) {//如果有Panel对话框存在
                    $rootScope.$broadcast('panelClose');
                    event.preventDefault();
                    return;
                }
            });
        }
    ]);

需要注意的是在dialog和panel对话框关闭时,如果要跳转页面,不应该写成$mdDialog.cancel();$tate.go()//跳转页面和mdPanelRef.close();$tate.go()//跳转页面,因为对话框关闭会有延迟,应该利用promise

正确写法为$mdDialog.cancel().then(function(){$state.go();});mdPanelRef.close().then(function(){$state.go();});

2.ng-change不允许传递$event参数

3.双向绑定的数据使用对象,如$scope.data=Object,ng-model='data.name',如果直接使用$scope.name和ng-model='name'有可能出现双向绑定失败

4.谷歌浏览器安装插件AngularJS Inspector可以在控制台中打印$scope对象,在插件Tab页可以看到整个网页的scope分布

5.可以获取元素调用controller()函数来获取到控制器,比如我表单name叫做personInfo,在控制台angular.element('[name=personInfo]').controller()可以把我这个个人信息编辑的控制器打印出来,包括里面的对象、函数、变量

6.Angular Material的多行文本框字数校验,在点击重置按钮手动的修改文本框的值以后,文字长度统计并不会修改,所以自定义了一个指令

.directive('textChange', ['$timeout',function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, elem, attrs) {
            scope.$on('textChanged', function () {
                $timeout(function () {
                    elem.triggerHandler('input');
                });
            });//可以通过$scope.$broadcast('textChanged');来触发textChanged事件
            scope.$watch(attrs.ngModel, function () {
                $timeout(function () {
                    elem.triggerHandler('input');
                });
            });
        }
    }
}]);
在文本框中增加text-change属性, <textarea text-change/>即可实现重置按钮点击以后修改,实际上建议在点击重置按钮以后手动的发送广播textChanged,因为通过$watch监听变化在首次加载页面的时候就会有form.$dirty问题




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值