AngularJS Phonecat实例讲解


Posted in Javascript onNovember 21, 2016

前言

最近关于AngularJS的资料也看了一些,其官网上有个实例Phonecat很不错,硬着头皮看了一会实在是看不下去,索性自己动手实现下,遇到问题时再从里面寻找答案也不失为一种好方法。说的再多、看的再多不如自己动手去做一遍,那就开始吧。

正文

1、布局

布局很简单,首页侧边栏是一个输入框和下拉框,右边是一个列表,实现时对首页不做大的修改。详情页做一些改变,尽量做一些简化,考虑加一个自定义指令(轮播图)。

2、架构分析

首先思考一下需要用到的服务。
由于我们要做的是一个单页应用,所以需要服务$route、$location。利用服务$resource获取资源。利用服务$filter对首页数据过滤以及排序。总结一下:

1).服务$route、$location负责路由管理及跳转。
2).服务$resource负责资源的获取。
3).服务$filter负责数据的过滤及排序。

3、首页及详情页view视图

1、首页视图

<div class="main">
  <div class="side">
    <p>
      <label>Search:</label>
      <input ng-model="filterKey" type="text" style="width:150px; ">
    </p>
    <p>
      <label>Sort by:</label>
      <select ng-model="sortKey">
        <option value="price">price</option>
        <option value="name" ng-selected="true">name</option>
      </select>
    </p>
  </div>
  <div class="content">
    <ul>
      <li ng-repeat="item in data" ng-click="$location.path('detail/'+item.id)">
        <img ng-src={{item.img}}>
        <div>
          <h2>名字:{{item.name}}</h2>
          <p>性能:{{item.title}}</p>
          <p>价格:{{item.price | currency}}</p>         
        </div>
      </li>
    </ul>
  </div>
</div>

2、详情页视图

<slide></slide>是一个自定义指令,实现轮播图的功能

<div class="detail">
  <slide links='links' w='200' h='200'></slide>
  <div class="text">
    <h2>设备:{{data.name}}</h2>
    <p>性能:{{data.desc}}</p>
  </div>
</div>

4、逻辑分析

1、首先说明下外部资源infor.json的信息。是一个数组,数组每一项为一个json对象,含有以下字段:

{
    "id" : 1,
    "name" : "aaa",
    "title" : "bbb",
    "desc" : "ccc",
    "img" : "img/a.jpg",
    "price" : 100,
    "showList" : "[{"url":"img/b.jpg"},{"url":"img/c.jpg"}]"
}

2、路由管理($route)

m1.config(['$routeProvider',function($routeProvider){

  $routeProvider
    .when('/index',{
      templateUrl : 'template/index.html',
      controller : 'index'
    })
    .when('/detail/:str',{
      templateUrl : 'template/detail.html',
      controller : 'detail'  
    })
    .otherwise({
      redirectTo : '/index'
    });

}]);

当形如http://localhost/phonecat/phone.html#/index加载index模板

当形如http://localhost/phonecat/phone.html#/detail/0加载detail模板

默认为http://localhost/phonecat/phone.html#/index

3、首页(index)逻辑分析

首页资源加载:

var arr = [];
var objRe = $resource('infor.json');  
$scope.data = arr = objRe.query(); //获得data数据后首页即可进行渲染

首页数据的过滤及排序:

$scope.$watch('filterKey',function(){ //监听输入框的数据变化,完成数据的筛选
    if($scope.filterKey){
      $scope.data = $filter('filter')(arr,$scope.filterKey);
    }else{
      $scope.data = arr; 
    }  
  })

  $scope.$watch('sortKey',function(){  //监听select下拉框的数据变化,完成数据的排序
    if($scope.sortKey){
      $scope.data = $filter('orderBy')($scope.data,$scope.sortKey); 
    }else{
      $scope.data = arr;
    }
  })


//这里有个需要注意的地方,我们用一个数组arr作为媒介,避免bug

点击列表进行详情页的跳转:

$scope.$location = $location; //将$location挂载到$scope下,模板中便可使用$location提供的方法

模板如下:

<li ng-repeat="item in data" ng-click="$location.path('detail/'+item.id)">  --点击的时候将列表跳转到详情页

4、详情页(detail)逻辑分析

m1.controller('detail',['$scope','$resource','$location',function($scope,$resource,$location){
  var id = parseInt($location.path().substring(8));  //获取索引
  $resource('infor.json').query(function(data){
    $scope.data = data[id];
    $scope.links = eval($scope.data.showList);  //自定义指令需要用到此数据
  });

}]);

//注意:$resource.query()为异步操作。数据相关的逻辑需要在回调中完成,否则可能会出现数据undefined的情况。

5、自定义指定slide的编写

AngularJS的自定义指定功能十分强大,为实现组件化开发提供了一种思路。下面简单地实现一个轮播组件。

用法示例: <slide links='links' w='200' h='200'></slide>

模板(slide.html)如下:

<div class="slide">
 <ul>
   <li ng-repeat="item in links">
     <img ng-src={{item.url}}>
   </li>
 </ul>
</div>
m1.directive('slide',function(){
  return {
    restrict : 'E',
    templateUrl : 'template/slide.html',
    replace : true,
    scope : {
      links : '=',
      w : '@',
      h : '@'
    },
    link : function(scope,element,attris){
      setTimeout(function(){
        var w = scope.links.length * scope.w;
        var h = scope.h;
        var iNow = 0;

        $(element).css({'width':scope.w,'height':h,'position':'relative','overflow':'hidden'})
        $(element).find('ul').css({'width':w,'height':h,'position':'absolute'});
        setTimeout(function(){
          $(element).find('li').css({'width':scope.w,'height':h,'float':'left'});
          $(element).find('img').css({'width':scope.w,'height':h});       
        },0);

        setInterval(function(){
          iNow++;
          $(element).find('ul').animate({'left':-iNow*scope.w},function(){
            if(iNow==scope.links.length-1){
              $(element).find('ul').css('left',0);
              iNow = 0;  
            }  
          });
        },1000)       
      },50)

    }
  }  
})

结语

AngularJS给我们提供了很多好用的功能,比如路由的管理、数据的过滤的等。更强大的功能还需要进一步的探索,此文仅作为一个好的开端。

Javascript 相关文章推荐
js浮点数精确计算(加、减、乘、除)
Dec 26 Javascript
详解AngularJS中的表格使用
Jun 16 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
Oct 14 Javascript
纯原生js实现贪吃蛇游戏
Apr 16 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
Vue2.0 实现单选互斥的方法
Apr 13 Javascript
vue better scroll 无法滚动的解决方法
Jun 07 Javascript
angular中子控制器向父控制器传值的实例
Oct 08 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
浅谈React 属性和状态的一些总结
Nov 21 #Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 #Javascript
jQuery用FormData实现文件上传的方法
Nov 21 #Javascript
遍历js中对象的属性和值的实例
Nov 21 #Javascript
JavaScript数据结构链表知识详解
Nov 21 #Javascript
jQuery简单自定义图片轮播插件及用法示例
Nov 21 #Javascript
Node.js测试中的Mock文件系统详解
Nov 21 #Javascript
You might like
ip签名探针
2006/10/09 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
python 队列详解及实例代码
2016/10/18 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Python简易版停车管理系统
2019/08/12 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
药学专业个人自我评价
2013/11/11 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
建议书的格式及范文
2015/09/14 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android