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 相关文章推荐
音乐播放用的的几个函数
Sep 07 Javascript
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
Apr 24 Javascript
在Windows上安装Node.js模块的方法
Sep 25 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
Feb 04 Javascript
JS正则表达式获取分组内容的方法详解
Nov 15 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
Feb 13 Javascript
详解Javascript模板引擎mustache.js
Jan 20 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
Nov 22 Javascript
Vue使用mixins实现压缩图片代码
Mar 14 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
浅谈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
解析php中die(),exit(),return的区别
2013/06/20 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
python递归函数绘制分形树的方法
2018/06/22 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python的debug实用工具 pdb详解
2019/07/12 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
如何使用python切换hosts文件
2020/04/29 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
python 制作磁力搜索工具
2021/03/04 Python
俄罗斯游戏商店:Buka
2020/03/01 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
传播学专业毕业生自荐信
2013/11/04 职场文书
贷款委托书范本
2014/04/08 职场文书
教师中国梦演讲稿
2014/04/23 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
金砖之国观后感
2015/06/11 职场文书
python实现三次密码验证的示例
2021/04/29 Python
python编写五子棋游戏
2021/05/25 Python
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis
LeetCode189轮转数组python示例
2022/08/05 Python