• 观《phonegap第三季 angularjs+ionic视频教程 实时发布》学习笔记(二)


    八、Angularjs自定义服务 provide里provider方法 以及factory、service方法以及provider供应商的概念

    Angular 提供了3种方法来创建并注册我们自己的服务。

    1. Provider

    Providers 是唯一一种你可以传进 .config() 函数的 service。当你想要在 service 对象启用之前,先进行模块范围的配置,那就应该用 provider。

    (1)var app=angular.mudle('myApp',[],function(provide){$provide.provider=...;this.$get=function(){};});

    (2)$scope.config=function(provide){}

    2. Factory     ——可返回对象和字符串

    Factory 方法直接把一个函数当成一个对象的$get 方法可以直接返回字符串

    用 Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。

    3. Service

    Service 是用"new"关键字实例化的。因此,你应该给"this"添加属性,然后 service 返回"this"。你把 service 传进 controller 之后,在controller里 "this" 上的属性就可以通过 service 来使用了

    4、三者的区别:

    (1)provider要放在this.$get里面

    (2)service可用this直接定义方法

    (3)只有provider可以传入config

    (4)service不能返回字符串

    九、Angularjs 常用服务 $http $location $anchorScroll $cacheFactory $timeout $interval $sce

    1.$http

    (1)get

    (2)post

    (3)jsonp

    2.$location

    $location服务解析地址栏中的URL(基于window.location),让你在应用代码中能获取到。改变地址栏中的URL会反应$location服务中,反之亦然。

    (1) 暴露当前地址栏的URL,这样你就能
     获取并监听URL。
     改变URL。
    (2)当出现以下情况时同步URL
     改变地址栏
     点击了后退按钮(或者点击了历史链接)
     点击了一个链接
    (3)一系列方法来获取URL对象的具体内容用(protocol, host, port, path, search, hash).formatDate

    (4)$location不会做

    当浏览器的URL改变时,不会重新加载整个页面。如果想要重新加载整个页面,需要使用$window.location.href。
    (5)内置方法:

    absUrl( ):只读;根据在RFC 3986中指定的规则,返回url,带有所有的片段。

    hash( ):读、写;当带有参数时,返回哈希碎片;当在带有参数的情况下,改变哈希碎片时,返回$location。

    host( ):只读;返回url中的主机路径。

    path( ):读、写;当没有任何参数时,返回当前url的路径;当带有参数时,改变路径,并返回$location。(返回的路径永远会带有/)

    port( ):只读;返回当前路径的端口号。

    protocol( ):只读;返回当前url的协议。

    replace( ):如果被调用,就会用改变后的URL直接替换浏览器中的历史记录,而不是在历史记录中新建一条信息,这样可以阻止『后退』。

    search( ):读、写;当不带参数调用的时候,以对象形式返回当前url的搜索部分。

    url( ):读、写;当不带参数时,返回url;当带有参数时,返回$location。

    3.$cacheFactory

    <script> 
    var m1 = angular.module('myApp',[]);
     m1.controller('Aaa',['$scope','$cacheFactory','$log',function($scope,$cacheFactory,$log){
     $log.error('hello'); 
    var cache = $cacheFactory('myCache');
     cache.put('name','hello'); cache.put('age','20'); cache.put('job','it'); }]);
    m1.controller('Bbb',['$scope','$cacheFactory','$log',function($scope,$cacheFactory,$log){ 
    var cache = $cacheFactory.get('myCache'); console.log(cache.get('name')); }]); 
    </script>

    4、$timeout

    $timeout(function(){ $scope.name = '123'; },1100);

    5、$interval

    $ inteval(function(){ $scope.name = '123'; },1100);

    6、$sce  ——用于解析html代码文章里面的标签

    var app = angular.module("myApp", []); app.controller('firstController',function($scope,$timeout,$sce,$http){ 
    $scope.name = 'hello'; 
    $scope.text = '<h1>hello</h1>';
     var myUrl = "http://www.phonegap100.com/appapi.php?a=getPortalArticle&aid=338&callback=JSON_CALLBACK"; $http.jsonp(myUrl).success( function(data){ 
    //$scope.portalDetail = data.result[0];
     $scope.detailContent = function() {
     return $sce.trustAsHtml(data.result[0].content); }; } ).error(function(){ alert('失败'); }); });

    7、$anchorScroll

    可直接跳转到网页上指定id的位置,例如点击某个li跳转至页面对应id处,方法一:$scope.hash(id);方法二:$anchorScroll();

    十、angularjs ngSanitize ngRoute ngAnimate插件

    1、ngSanitize     ——ng-bind的插件

    让浏览器简析html标签
    (1) 引入js angular-sanitize.min.js
    (2) 在module 中引入一下插件 var app = angular.module("myApp", ['ngSanitize']);
    (3) 使用<div ng-bind-html="text"></div> 绑定数据

    2、ngRoute

    引入js 依赖注入
    <script src="http://cdn.bootcss.com/angular.js/1.2.9/angular-route.min.js"></script>

    var m1 = angular.module('myApp',['ngRoute']);
    m1.config(['$routeProvider',function($routeProvider){ $routeProvider .when('/aaa/:num',{
     template : '<p>首页的内容</p>{{name}}',//可以是标签,可以是url
    controller : 'Aaa' 
    }) .when('/ccc',{ 
    template : '<p>课程的内容</p>{{name}}',
     controller : 'Ccc' }) .otherwise({
     redirectTo : '/aaa' 
    }); }]);

    (1)$rootParams

    (2)$on

    (3)$routeChangeStart

    (4)$routeChangeSuccess/Error

    3、ngAnimate     ——页面切换动效

    (1) 引入js
    <script src="http://cdn.bootcss.com/angular.js/1.3.8/angular-animate.min.js"></script>
    (2) var m1 = angular.module('myApp',['ngAnimate']);
    (3) 使用下面的几种方式

    CSS3的方式(1)

    ng-enter

    ng-enter-active

    ng-leave

    ng-leave-active

    支持的指令

    if,view,repeat,include,swtich repeat:ng-enter-stagger animation-delay

    CSS3的方式(2)

    ng-hide-add

    ng-hide-add-active

    ng-hide-remove

    ng-hide-remove-active

    支持的指令

    class,show,hide,model等

    JS方式

    animation()

    enter/leave

    removeClass/addClass

    m1.animation('.box',function(){
     return { 
    addClass : function(element,sClass,done){ 
    //console.log(element); 
    //console.log(sClass); 
    //console.log(done); 
    
    $(element).animate({0,height:0},1000,done); }, 
    
    removeClass : function(element,sClass,done){ $(element).css({0,height:0}); $(element).animate({200,height:200},1000,done); } }; });

    十一、$resource 数据交互插件

    后端支持跨域请求: header('Access-Control-Allow-Origin: *');

     1、$resource   

    $resource(url, [paramDefaults], [actions], options);

    支持方法:

    {

    'get': {method:'GET'},

    'save': {method:'POST'},

    'query': {method:'GET', isArray:true},

    'remove': {method:'DELETE'},

    'delete': {method:'DELETE'}

    };

    (1) 引入 angular-resource.min.js
    (2) 定义模块时加载ngResource
    var app = angular.module('app',["ngResource"]);

    (3)var User = $resource('/user/:userId', {userId:'@id'});

      var user = User.get({userId:123}, function() { user.abc = true; user.$save(); });

    myAppModule.factory('CreditCard', ['http', function($http) {
     var baseUrl = '/user/123/card';
     return { 
    get: function(cardId) {
     return $http.get(baseUrl + '/' + cardId); },
    save: function(card) { 
    var url = card.id ? baseUrl + '/' + card.id : baseUrl; 
    return $http.post(url, card); },
    query: function() {
     return $http.get(baseUrl);
     }, 
    charge:
    function(card) { return $http.post(baseUrl + '/' + card.id, card, {params: {charge: true}}); } }; }]);
    myAppModule.factory('CreditCard', ['$resource', function($resource) { 
    return $resource('/usr/:userId/card/:cardId',
    {userId: 123, cardId: '@id'},
    {charge: {method: 'POST', params: {charge: true}, isArray: false}); }]);

    十二、手机app开发的几种方式 ionic学习思路以及ionic新建的项目分析

    1. 目前开发手机app的几种方式

    (1)原生/Native:使用原生SDK开发App。优点不用说,当你有足够的资源,这是最理想的方式;缺点是对不同的 平台要分别开发,学习成本高,开发成本高、开发周期长、不易于web开发人员和企业建站公司转型;

    (2)原生脚本/NativeScript:将原生API封装成JavaScript接口,这有点像前端的nodejs。NativeScript方式 与原生相比性能损失不大(据称只有10%左右),优点是开发语言统一使用JavaScript,缺点是 要针对不同的平台分别开发。

    (3)原生+web/ Hybrid:使用原生技术开发,部分页面调用web。优点是比纯原生开发周期短, 页面更新方便,如支付宝,还有很多app的详情页面。缺点:需要原生和web配合。

    (4)混合/Hybrid:使用web技术开发App,使用Cordova/PhoneGap之类进行打包封装。优点是采用标准的web技术开发, 避免了不同平台原生开发体系的学习,学习成本低,上手快、效率高,一次开发 微信 wap app全部搞定;缺点是app 在android平台性能上有一些损失,但是相信硬件的发展会接近原生。

    ——ionic属于hybrid开发模式,本质上是将移动web应用与浏览器打包,优点 MVC 基于angularjs,运行速度快 UI漂亮 开发简单 缺点:学习成本比其他的html5框架稍微高一些(比如jqmobi) 需要具备angularjs基础。 是否采用这种模式,需要根据具体情况综合考虑。

    十三、ionic css布局介绍

    1、布局模式

    基本布局:标题/header、内容/content和页脚/footer。

     .bar.bar-header - 声明元素为标题区
     .bar.bar-footer - 声明元素为底部
     .content . scroll-content- 声明元素为内容区

    2、.bar : 位置

    ionic使用以下样式定义条块的位置:

     .bar-header - 置顶
     .bar-subheader - header之下置顶
     .bar-footer - 置底
     .bar-subfooter - footer之上置底

    3、.bar : 嵌入子元素

    在ionic中,有三种.bar子元素的样式是预定义的:(1)标题文字 - 对包含标题文字的元素应用.title样式,通常使用h1元素;(2)按钮 - 对用作按钮的元素,应用.button样式,通常使用button 或a元素作为按钮。注意按钮将使用.bar的配色方案;(3)工具栏 - 工具栏包含一组按钮。对用作工具栏的元素,应用.button-bar样式,通常 使用div元素作为工具栏。

    4、bar : 嵌入input

    一种常见的UI模式是在标题栏中嵌入搜索栏。

    在.bar元素中嵌入input元素,需要注意两点:
    1. 在条块元素上应用.item-input-inset样式
    2. 将input包裹在应用.item-input-wrapper样式的元素内

    5、内容:.content和.scroll-content

    ionic预定义了两个内容容器样式:
     .content – 相对定位
     .scroll-content - 绝对定位,内容元素占满整个屏幕

    6、Ionic 色彩、图标和边距

    (1)ionic定义了九种前景/背景/边框的色彩样式

    (2)ionic 中的图标

    使用图标很简单,在元素上声明以下两个CSS类即可:
     .icon - 将元素声明为图标
     .ion-{icon-name} - 声明要使用的具体图标

    7、ionic界面组件列表

    (1)列表 : .list

    (2)成员容器 : .item

    (3).item : 嵌入文本:.item元素可以使用h1~h6/p标签插入不同规格的文本。

    (4).item : 嵌入图标

    (5).item : 嵌入头像

    (6).item : 嵌入缩略图

    (7).item : 嵌入大图 item-image

    (8).item card

    要插入图标,需要满足两个条件:
    a. . card 可以让list和左右有一些边距
    b. 在. item-divider元素定义list的头和尾

    8、ionic界面组件按钮

    (1)按钮 : .button

    (2).button : 嵌入图标

    (3)在列表中使用按钮

    (4)button-block  ——button显示成块元素

    9、ionic界面组件 表单输入

    (1)输入组件容器 : .item-input

    (2)文本输入 : input[type="text"]

    (3)文本输入:使用占位符做标签

    (4)文本输入:堆叠式标签

    (5)开关 : .toggle input[type="checkbox"]

    (6)复选按钮

    (7)单选按钮 : .item-radio input[type="radio"]

    (8)滑动条 : .range input[type="range"]

    (9)选择框 : .item-select select

    10、界面组件选项卡

    (1)选项卡 : .tabs

    (2)tab-item : 使用图标

    (3).tab-item : 使用徽章

    (4).tabs : 顶部选项卡

    (5).tab-striped .tabs: 条带风格选项卡

    11、栅格系统

    (1).col : 默认的定宽列

    (2).col-{width-percent} : 指定列宽

    供我们快速指定列宽:
    .col-10 - 占据容器10%宽度

    .col-20 - 占据容器20%宽度

    .col-25 - 占据容器25%宽度

    .col-33 - 占据容器33%宽度

    .col-50 - 占据容器50%宽度

    .col-67 - 占据容器67%宽度

    .col-75 - 占据容器75%宽度

    .col-80 - 占据容器80%宽度

    .col-90 - 占据容器90%宽度

    (3).col-{width-percent} : 指定列宽

    (4).col-offset-{width-percent} : 指定列偏移

    (5).col-{align} : 列纵向对齐

    .col-top - 让元素纵向顶对齐

    .col-center - 让元素居中对齐

    .col-bottom - 让元素向底对齐

    十四、ionic js指令布局介绍

    1、ion-header-bar

    align-title - 设置标题文字的对齐方式。允许值:left | right | center,分别对应左对齐、 右对齐和居中对齐。
     no-tap-scroll - 当点击标题时,是否将内容区域自动滚动到最开始。允许值:true | false,默认为false。

    2、ion-footer-bar

    align-title - 设置标题文本的对齐方式。允许值:left | right | center 。

    3、ion-content

    4、ion-scroll

    ion-scroll指令有两个常用的可选属性:
     direction - 内容可以滚动的方向。允许值:x|y|xy。默认为 y。
     zooming - 是否支持pinch-to-zoom(捏拉缩放)。允许值:true | false。

    5、ion-refresher

    ion-refresher指令有以下可选的属性:
     on-refresh - 当用户向下拉动足够的距离并松开时,执行此表达式
     on-pulling - 当用户开始向下拉动时,执行此表达式
     pulling-text - 当用户向下拉动时,显示此文本
     pulling-icon - 当用户向下拉动时,显示此图标
     refreshing-icon - 当用户向下拉动并松开后,显示的等待图标。ionic推荐使用spinner 代替这个属性
     spinner - 和refreshing-icon的作用一样,但spinner是基于SVG的动画
     disable-pulling-rotation - 禁止下拉图标旋转动画

    6、ion-infinite-scroll

    ion-infinite-scroll指令有如下属性:
     on-infinite - 必须。当滚动到底部时执行此表达式
     distance - 可选。距底部距离百分比。当距离底部超过此数值时,执行on-infinite。默认为1%
     icon - 可选。载入时显示的图标。默认是ion-load-d。ionic推荐使用spinner代替icon属性
     spinner - 可选。载入时的spinner。默认是ionSpinner
     immediate-check - 可选。是否在载入时立即检查滚动框范围

    7、$ionicScrollDelegate

    可以使用服务$ionicScrollDelegate,通过脚本控制滚动容器(ion-scroll或ion-content)。 $ionicScrollDelegate服务提供的常用方法如下:
     resize()
    重新计算容器尺寸。当父元素大小变化时,应当调用此方法
     scrollTop([shouldAnimate])
    滚动到内容顶部。shouldAnimate参数为true|false,表示是否使用动画展示滚动过程
     scrollBottom([shouldAnimate])
    滚动到内容底部。shouldAnimate参数为true|false,表示是否使用动画展示滚动过程
     scrollTo(left,top[,shouldAnimate])
    滚动到指定位置。left和top分别表示要滚动到的x坐标和y坐标
     scrollBy(left,top[,shouldAnimate])
    滚动指定偏移量。left和top分别表示要滚动的x偏移量和y偏移量
     getScrollPosition()
    读取当前视图位置。返回值为一个JSON对象,具有left和top属性,分别表示x和y坐标

  • 相关阅读:
    谷歌技术"三宝"之BigTable
    谷歌技术"三宝"之谷歌文件系统
    谷歌技术"三宝"之MapReduce
    大话存储
    ASP.NET之旅--深入浅出解读IIS架构
    好网站
    ArcGIS API for Silverlight学习资料积累
    浏览器滚动条快到底部时自动加载数据
    MVC EF中Attach和Entry区别
    微信开发jssdk入门
  • 原文地址:https://www.cnblogs.com/liujiale/p/5953669.html
Copyright © 2020-2023  润新知