zoukankan      html  css  js  c++  java
  • angular实例教程(用来熟悉指令和过滤器的编写)

      angular的插件太少了,  所以很多指令过滤器都要自己写,  所以对指令传进来的参数, 以及angular编译的流程更加熟悉才行写出好的插件, 有些简单的指令是参考angularUI里面, 作为自己的angular指令笔记;

      1:angular的字符串截取指令

      2:angular的国际化

      3:angular的xhr案例

      4:自己写angular中的for指令书写;

      第一个是truncate, 这就是溢出隐藏的效果, css中是通过text-overflow:ellipsis; overflow:hidden; display:block 实现的, 如果JS要实现这些效果,也很简单, 现在通过angular的指令实现了, 感觉爽爽哒, 因为是在chrome下写的demo所以没有做别的浏览器兼容,chrome的开发工具太强大了啦 , 自己点击打开即可查看啦, 啦啦啦, 你懂的, 为什么要这么多"啦"啦;

    <html ng-app="app">
        <head>
            <meta charset="utf-8" />
            <script src="http://cdn.bootcss.com/jquery/2.1.1-rc2/jquery.min.js"></script>
            <script src="http://cdn.bootcss.com/angular.js/1.3.0-beta.13/angular.min.js"></script>
        </head>
    <body ng-controller="test0Controller">
        <ul>
            <li ng-repeat="s in strs">
                {{s | characters:8}}
            </li>
        </ul>
        <script type="text/javascript">
            var app = angular.module("app",["truncate"]);
            app.controller("test0Controller" , function($scope) {
                $scope.strs = [
                    "test0Controller",
                    "test20Con2troller1",
                    "2test20Controller2",
                    "tes2t0Contr2oller"
                ];
            });
            angular.module("truncate",function(){})
            .    filter("characters",function(){
                return function(input , number) {
                    return typeof input === "string" ? 
                        input.length < number ?
                        input : (input.slice(0,number-4) + "....")
                    : input
                }
            });
        </script>
    </body>
    </html>

      angular有个大名鼎鼎的国际化(angular国际化)的插件都知道了,但是用的人不多啊, 如果要自己实现国际化该如何实现呢, 可以参考我的指令, 10行代码就足够了;

    <html ng-app="app">
        <head>
            <meta charset="utf-8" />
            <script src="http://cdn.bootcss.com/jquery/2.1.1-rc2/jquery.min.js"></script>
            <script src="http://cdn.bootcss.com/angular.js/1.3.0-beta.13/angular.min.js"></script>
        </head>
    <body>
        <div translatediv ng-controller="tr">
            {{hehe}}//
            <br>
            <button ng-click="setLanguage('ch')">
                ch
            </button>
            <button ng-click="setLanguage('en')">
                en
            </button>
            <button ng-click="setLanguage('default')">
                default
            </button>
        </div>
        
        <script type="text/javascript">
            var app = angular.module("app",["translate"]);
            app.controller("tr", function($scope,$timeout) {
                $scope.trans = {
                    en : {"hehe" : "enenen"},
                    ch : {"hehe" : "chchch"},
                    default : {"hehe" : "nimo"}
                };
            });
            angular.module("translate",function() {})
            .factory("cache", function() {
                var arr = [];
                return {
                    set : function(arg) {arr.push(arg); return arr.splite(arr.indexOf(arg),1) },
                    del : function(arg) { return arg === arr.splite(arr.indexOf(arg),1)  }
                }
            })
            .directive("translatediv",["cache","$timeout",function(cache,$timeout) {
                return {
                    link : function($scope, $elem, $attr) {
                        var trans = $scope.trans;
                        $scope.setLanguage = function(arg) {
                            //alert($scope)
                            for(var prop in trans) {
                                if(arg === prop) {
                                    for(var nameVar in trans[prop]) {
                                        $scope[nameVar] = trans[prop][nameVar];
                                    };
                                };
                            };
                        };
    
                        $timeout(function(){
                            $scope.setLanguage("default");
                        },0);
                    }
                }
            }])
        </script>
    </body>
    </html>

      实现要说的是filltext这个网站真心不错,老外真是无聊到家了, 前台只要请求一个url就返回一堆假数据(mock),比如:http://filltext.com/?rows=10&fname={firstName}&lname={lastName}&callback=JSON_CALLBACK , 这个例子非常简单, 话说angular和jQ思想真的差别很大啊;

    <html ng-app="app">
        <head>
            <meta charset="utf-8" />
            <script src="http://cdn.bootcss.com/jquery/2.1.1-rc2/jquery.min.js"></script>
            <script src="http://cdn.bootcss.com/angular.js/1.3.0-beta.13/angular.min.js"></script>
        </head>
    <body>
        <div ng-controller="refresh">    
            <angular-refresh url="http://filltext.com/?rows=10&fname={firstName}&lname={lastName}&callback=JSON_CALLBACK" ng-model="people" interval="5000" method="jsonp">
            </angular-refresh>
            <ul ng-repeat="person in people">
                <li>{{person.fname}} {{person.lname}}</li>
            </ul>
        </div>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.controller("refresh", function() {
    
            });
            app.directive("angularRefresh",function($http,$timeout,$parse) {
                return {
                    restrict : "AE",
                    transclude : true,
                    template : "<div></div>",
                    compile : function(elem, attrs) {
                        var interval = attrs.interval;
                        return function($scope, $elem, $attrs ) {
                            var xhr = function() {
                                $http[$attrs.method]($attrs.url).then(function(data){
                                    $parse($attrs.ngModel).assign($scope,data.data);
                                },function(){alert("wrong")})
                            };
                            
                            $timeout(function() {
                                xhr();
                            }, parseInt($attrs.interval) || 5000 );
                        }
                    }
                }
            });
        </script>
    </body>
    </html>

      angular中的for指令真是太好用了, 如果自己实现一个岂不是更好。 其实angular最厉害还是双向绑定, 和指令联合在一起 ,从另一种方面来说就是:“酷炫”:

    <html ng-app="app">
        <head>
            <meta charset="utf-8" />
            <script src="http://cdn.bootcss.com/jquery/2.1.1-rc2/jquery.min.js"></script>
            <script src="http://cdn.bootcss.com/angular.js/1.3.0-beta.13/angular.min.js"></script>
        </head>
    <body>
        //自定义指令实现forin循环
        <div ng-controller="forin">    
            <div>
                {{xs | json}}
            </div>
            <for x in xs>
                <p>{{ x }}</p>
            </for>
            <button ng-click="xs = [1,2,3,4,5,6,7,8]">change</button>
        </div>
        <script type="text/javascript">
            var app = angular.module("app", []);
            
            app.controller("forin", function( $scope ) {
                $scope.xs = ["0adsf22","1sdf","sdf2","3adsf","4sdf"];
            });
            app.directive("for", function($compile) {
                return {
                    restrict : "AE",
                    replace : true,
                    compile : function(ele, attrs, cloneTransclude) {
                        var outerHTML = ele.get(0).outerHTML;
                        //debugger;
                        var regResult = outerHTML.match(/for([sw="]*)in([sw="]*)/i);
                        var prop  = regResult[1].match(/[a-z]/g).join("");
                        var props  = regResult[2].match(/[a-z]/g).join("");
                        var compile = $compile(ele.html())
                        ele.empty();
                        return function($sc, $ele, $attrs) {
                            //这个有报了一个undefined, 不知道是什么原因, 你们知道的话指导我下;
                            
                            //监听这个对象是否发生改变;
                            $sc.watch(props,function() {
                                for(var i=0, len = $sc[props].length ;i<len;i++) {
                                    var newSc = $sc.$new();
                                    newSc[prop] = $sc[props][i];
                                    var node = compile(newSc,angular.noop);
                                    $ele.append(node);
                                };
                            });
                        }
                    }
                }
            });
        </script>
    </body>
    </html>

      上次大概浏览了angular的源代码, 对写出更好的指令还是有帮助的, 就像用jq看jQ源码一样的。

  • 相关阅读:
    面向对象一
    模块二:os模块、sys模块、json模块、pickle模块,包
    模块一:时间模块、random模块、hashlib模块、日志模块
    异常处理、迭代器、推导式、生成器
    有参装饰器
    匿名函数、高阶函数
    装饰器
    函数对象、函数嵌套、闭包函数
    名称空间与作用域
    day17 django 相关
  • 原文地址:https://www.cnblogs.com/diligenceday/p/4186791.html
Copyright © 2011-2022 走看看