美文网首页
2018-12-11

2018-12-11

作者: 海子小夜曲 | 来源:发表于2018-12-11 19:41 被阅读0次

    首先浏览器载入HTML,然后解析成DOM,之后载入angular.js 脚本。之后angularJS寻找ng-app指令,这个指令指示了应用边界,使用ng-app中指定的模块来配置注入器$injector,注入器是用来创建编译服务$compilesevice和根作用域$rootScope的。编译服务是用来编译DOM并把它连接到根作用域。在执行过程中,利用MVC模式渲染视图。这就是angularjs渲染界面的机制。然后angular还有提供与浏览器还有用户的交互。首先浏览器一直处于监听状态,一旦有事件触发以后,一般事件比如说用户的交互操作,定时事件、或者网络事件这些,一旦触发事件。回调会被执行。此时进入js上下文。通常情况下回调会修改dom结构,一旦回调执行完毕,浏览器就会离开JavaScript上下文,并根据dom的修改从新渲染视图。

    MVC架构模式是用户操作操作,然后view负责接收用户的操作,之后交给controller做业务逻辑处理,然后是model的数据持久化,将结果反馈给view。

    MVVM是view跟model之间通过viewmodel进行交互,而且viewModel和model之间的交互是双向的,因此视图的数据改变后同时会修改数据源,而数据源的改变同样会反馈到view上

    回调就是指,事件触发后,事件就被加入到事件队列里,事件队列里的事件会被一个一个的执行,执行的时候如果这个事件被$apply包裹,就会进入到angular的context中,函数就是我们希望在context里执行的函数,通常情况下这些函数会改变应用的某些状态。

    angular的特点有数据双向绑定,spa。

    所谓数据双向绑定就是指从界面的操作实时反映到数据,数据的变更能实时展现到界面上。插值语法实现数据的展示,在通过ng-model实现双向数据绑定。比如说

    angular的单页面应用是利用了路由机制配合末班引擎实现的。一个应用只有一个主页面,通过路由切换不同的状态,嵌套对应的模板引擎,而模板中的动态数据是通过ajax请求从后台拿到的。这种从路由的跳转到渲染完整界面的过程,除了主页面的静态数据,其他全靠js完成

    首先定义主模块,叫做每日一课吧,首先配置路由,他依赖于ngRoot所以需要注入一个ngRoot,配置路由就需要$rootProvider,然后根据实际路由的情况给他配置templateURL,以及需要绑定的控制器。$rootProvider.when绑定,最后还有一个otherwise  里面有一个重定向 redirectTo  today。 对应路由的时候一定别忘了设置ng-view

    里面用的css3的新属性transform就是做一个动画效果,这个按钮控制侧边导航栏的出现与隐藏。给根作用域绑定一个toggle事件。在按钮的位置绑定一个点击事件ng-click=toggle。这个切换时控制根作用域的一个collapse属性,false的时候就显示,true的时候就折叠。然后根据这个collapse属性是布尔值判断,之后根据相应的值做动画,结合translate和动画延迟,transitionduration这三个条件做出来。

    <meta name="referrer" content="never"> 标签突破防盗链

    解决跨域

    跨域是浏览器的同源策略导致,但是服务器之间就没有跨域一说,所以可以通过注入$http请求,向本地写一个PHP文件 给他发送请求,然后叫服务器去豆瓣的服务器去请求数据。之后拿到数据再渲染到界面,请求数据的api是豆瓣自己提供的,我只需要请求的时候发送一个日期 我用的是get请求,需要传个params,里面包含当前日期就行。然后用到了过滤器,所以需要注入$filter,定义一个过滤器$filter(date),然后调用的时候可以通过new Date()得到当前事件,在传入想要的格式,然后就得到豆瓣这个api需要的格式.请求得到数据后,打印一下,看看具体的到什么样式的数据,然后取到数据绑定$scope上,通过差值语法,哪儿用

    自定义指令

    directive  这里面我定义了一个请求数据的时候需要有个小动图显示正在加载,比如叫loading 然后给他设置template,template是个字符串,是个img标签。给标签设置ng-hide 跟loaded属性关联,来决定是否显示。这个load属性绑定在$rootScope.loaded上,默认值为false,所以加载的时候loaded是false,这个标签就会显示,加载完成后在$http的success里把$rootScope.loaded赋值为true,此时就隐藏了。

    整个项目用了一些基本的东西。angular的指令,自定义指令。然后就是依赖注入,用到了$http,$filter,$rootScope,双向数据绑定,利用路由实现单页面应用。

    <meta charset="UTF-8">

    angular的宗旨是尽量减少dom操作,所以尽量不要引用jQuery。其本身自带封装好的jqLite已经包含了大多数所需api。例如

    使用方法

    angular.element(element);

    element:包装成jquery对象的html字符串或者dom元素

                        addClass() 给元素添加指定的类。 

                        after() 在元素的后面插入内容。 

                        append() 将内容插入到元素的尾部。 

                        attr() 获取或者设置元素的属性①值。 

                        bind()/on() 给选中元素的一个或者多个事件附加一个事件处理程序。 

                        children() 获取元素的子元素。 

                        clone() 创建一个元素的深复制。 

                        contents() 获取每个元素的子节点,返回的集合中包含文本和注释节点。 

                        css() 获取或设置元素的style属性值。 

                        data() 存储或返回与元素关联的指定数据值。 

                        eq() 获取指定索引位置的元素。 

                        find() 过滤元素的子节点,只能通过标签名过滤。 

                        hasClass() 确定元素本身是否分配了给定的类。 

                        html() 获取或者设置元素的HTML内容。 

                        next() 获取紧跟元素的兄弟元素。 

                        off()/unbind() 通过名称移除一个事件处理程序。 

                        parent() 获取元素的父元素。 

                        prepend() 将内容插入到元素的开头。 

                        prop() 获取或设置元素的属性①值。 

                        ready() 指定一个DOM加载完成时执行的函数。 

                        remove() 从DOM中移除元素。 

                        removeAttr() 从元素中移除一个属性(attribute)。 

                        removeClass() 从元素中移除一个、多个或者所有类。 

                        removeData() 从元素中移除先前存储的数据。 

                        repalceWith() 使用提供的新内容替换元素。 

                        text() 获取或者设置元素中合并的文本内容。 

                        toggleClass() 从元素中添加或者移除一个或者多个类。 

                        triggerHandler() 执行附加给元素的某个事件的所有事件处理程序。 

                        val() 获取或设置元素的当前值。 

                        wrap() 使用指定的HTML结构包裹元素。 

    1. ng-model是用于表单元素的,支持双向绑定。对普通元素无效;

    2. ng-bind用于普通元素,不能用于表单元素,应用程序单向地渲染数据到元素;

    3. 当ng-bind和{{}}同时使用时,ng-bind绑定的值覆盖该元素的内容。

    ng-repeat 和ng-options的区别

    ng-repeat 指令是通过数组来循环 HTML 代码来创建下拉列表,但 ng-options 指令更适合创建下拉列表,它有以下优势:

    使用 ng-options 的选项的一个对象, ng-repeat 是一个字符串。

    $scope.sites = [

        {site : "Google", url : "http://www.google.com"},

        {site : "Runoob", url : "http://www.runoob.com"},

        {site : "Taobao", url : "http://www.taobao.com"}

    ];

    ng-repeat 有局限性,选择的值是一个字符串:

    实例

    使用 ng-repeat:

    <select ng-model="selectedSite">

    <option ng-repeat="x in sites" value="{{x.url}}">{{x.site}}</option>

    </select>

    <h1>你选择的是: {{selectedSite}}</h1>

    2017/8/1 15:11 - 屏幕剪辑

    使用 ng-options 指令,选择的值是一个对象:

    实例

    使用 ng-options:

    <select ng-model="selectedSite" ng-options="x.site for x in sites">

    </select>

    <h1>你选择的是: {{selectedSite.site}}</h1>

    <p>网址为: {{selectedSite.url}}</p>

    2017/8/1 15:12 - 屏幕剪辑

    当选择值是一个对象时,我们就可以获取更多信息,应用也更灵活。

    ng-options 使用对象有很大的不同,如下所示:

    实例

    使用对象作为数据源, x 为键(key), y 为值(value):

    <select ng-model="selectedSite" ng-options="x for (x, y) in sites">

    </select>

    <h1>你选择的值是: {{selectedSite}}</h1>

    2017/8/1 16:11 - 屏幕剪辑

    novalidate 属性在应用中不是必须的,但是你需要在 AngularJS 表单中使用,用于重写标准的 HTML5 验证。

    <form novalidate>

    </form>

    angular的表单验证

    required  必填

    ng-required 必须,而且允许我们基于控制器布尔条件标记输入字段为必须

    ng-minlength  定输入文本值的最小长度

    ng-maxlength  该指令可以设定文本输入值的最小长度

    ng-pattern  文本输入的有效性可以针对指定的正则表达式模式进行检查

    type=”email”  文本输入内置电子邮件验证。

    type=”number”  带有数量验证的文本输入。也可以有最小和最大值的附加属性。

    type=”date”  如果浏览器支持,显示一个HTML日期选择器。否则,默认为一个文本输入。ng-model

    绑定到日期对象。预计日期格式为yyyy-mm-dd(例如2009-10-24)。

    type=”url”  带有输入验证的URL文本输入。

    相关文章

      网友评论

          本文标题:2018-12-11

          本文链接:https://www.haomeiwen.com/subject/mfoehqtx.html