解析angular在github中step-12 利用事件实现缩略图切换效果

深入解析angular中事件处理机制中实现缩略图切换效果 step-12

一、首先看页面效果

在页面中我们点击右侧的小缩略图,左侧的图片能够做出动态的切换效果,那么这是怎么实现的恩?

二、实现思路:

1、导入angular-animate.js

2、在手机详细视图我们把大图片的ngSrc指令绑定到mainImageUrl属性上,同时我们注册一个ngClick处理器到缩略图上。当一个用户点击缩略图的任意一个时,这个处理器会使用setImage事件处理函数来把mainImageUrl属性设置成选定缩略图的URL。

三、实现过程分析:

1、
phone-list.html页面

当该页面加载的时候会调用Phone.query(); 然后$resource会去phones/phones.json文件。因为在 params:{phoneId:‘phones‘}中phoneId被赋值为phones。

如是说:service.js

<span style="font-size:18px;">'use strict';

/* Services */

var phonecatServices = angular.module('phonecatServices', ['ngResource']);

phonecatServices.factory('Phone', ['$resource',function($resource){
    return $resource('phones/:phoneId.json', {}, {
      query: {method:'GET', params:{phoneId:'phones'}, isArray:true}
    });
  }]);
</span>

简要说明如下:

模块名为:phonecatServices

服务名:Phone

定义的方法名为:query、发送的事get请求并传递一个参数,变量名为phoneId,返回的是一个数组。

2、接着我们看下phone-list.html

 <ul class="phones">
        <li ng-repeat="phone in phones | filter:query | orderBy:orderProp" class="thumbnail phone-listing">
          <a href="#/phones/{{phone.id}}" class="thumb"><img ng-src="{{phone.imageUrl}}"></a>
          <a href="#/phones/{{phone.id}}">{{phone.name}}</a>
          <p>{{phone.snippet}}</p>
        </li>
      </ul>

在这里的每张显示的图片都加了一个url,并且每张图片上都带有phone.id 这个很重要,因为它携带的是json文件的文件名:比如说phones.json文件(也就是列表页面要加载的文件)

部分示例:

 {
        "age": 6,
        "carrier": "Best Buy",
        "id": "nexus-s",
        "imageUrl": "img/phones/nexus-s.0.jpg",
        "name": "Nexus S",
        "snippet": "Fast just got faster with Nexus S. A pure Google experience, Nexus S is the first phone to run Gingerbread (Android 2.3), the fastest version of Android yet."
    }, 

看到没?这里的phone.id就是指nexus-s(在下面可以据此找对应的文件)

当我们点击图片时首先执行的是:app.js

'use strict';

/* App Module */

var phonecatApp = angular.module('phonecatApp', [
  'ngRoute', //添加依赖的资源,必须要有angular-route.js
  'phonecatAnimations',
  'phonecatControllers',
  'phonecatFilters',
  'phonecatServices'
]);

//定义路由规则
phonecatApp.config(['$routeProvider',function($routeProvider) {
    $routeProvider.when('/phones', {
        templateUrl: 'partials/phone-list.html',
        controller: 'PhoneListCtrl'
      }).
      when('/phones/:phoneId', {
        templateUrl: 'partials/phone-detail.html',
        controller: 'PhoneDetailCtrl'
      }).
      otherwise({
        redirectTo: '/phones'
      });
  }]);

在这里因为定义了路由规则,自然就到了详细列表页面。注意:这里定义的变量是phoneId ,也就是前一个也面携带过来的参数:phone.id 。到了这个页面就要收PhoneDetailContrl控制了。

接着再看页面phone-detail.html

<ul class="phone-thumbs">
  <li ng-repeat="img in phone.images">
    <img ng-src="{{img}}" ng-click="setImage(img)">
  </li>
</ul>

小图是从这里遍历出来的,你可能好奇这个phone.images是从哪里冒出来的?别急。。。

我们看下控制器部分:

phonecatControllers.controller('PhoneDetailCtrl', ['$scope', '$routeParams', 'Phone',
  function($scope, $routeParams, Phone) {
    $scope.phone = Phone.get({phoneId: $routeParams.phoneId}, function(phone) {
      $scope.mainImageUrl = phone.images[0];
    });

    $scope.setImage = function(imageUrl) {
      $scope.mainImageUrl = imageUrl;
    }
  }]);

通过Phone这个服务发送的get请求根据页面传来的phoneId (也即是上面的nexus-s)能够获取到相对应的手机介绍信息,也即是一个手机对象。比如说:nexus-s.json文件

部分展示:

"id": "nexus-s",
    "images": [
        "img/phones/nexus-s.0.jpg",
        "img/phones/nexus-s.1.jpg",
        "img/phones/nexus-s.2.jpg",
        "img/phones/nexus-s.3.jpg"
    ], 

这个时候不就可以使用phone.images来遍历images 了吗啊?

当然今天 的重点是事件响应机制的分析,前面已经做足了铺垫,看上面的phone-detail.html中是不是有个ng-click指令?当我点击小图片的时候首先执行的事setImage函数将当前选中的imgeUrl赋值给主mainImageUrl ,这时候就实现了大图替换,大图中默认是显示json文件中配置的第一个图片。

  分享是一种美德,学习进步离不开交流 O(∩_∩)O~

时间: 2024-08-07 14:32:24

解析angular在github中step-12 利用事件实现缩略图切换效果的相关文章

Github学习之MagicViewPager实现特色轮播切换效果

本片文章学习自翔哥的库: https://github.com/hongyangAndroid/MagicViewPager 实现效果: Rotate Y Rotate Down Rotate Up Alpha ScaleIn ScaleIn + Alpha + Rotate Down 效果贴了这么多,看看如何实现的吧. 添加依赖: compile 'com.zhy:magic-viewpager:1.0.1' 布局: <?xml version="1.0" encoding=&

AngularJS学习--- 动画操作 (Applying Animations) ngAnimate step 12

1.切换目录 git checkout step-12 npm start 2.效果图 这里在点击右边的缩略图时,会有一个很明显的从下向上的动画过程. 3.代码实现: step11和step12之间的代码差异:https://github.com/angular/angular-phonecat/compare/step-11...step-12 Dependencies(依赖的js库): bower.json { "name": "angular-seed", &

http请求头中的Content-Type属性在angular 和 node中的用法

post请求的请求体有以下两种格式: 1. 字符串: 'name=code_bunny&age=12' 这种格式的请求体,需要配置请求头 'Content-Type':'application/x-www-form-urlencoded' 2. json: {name:'code_bunny',age:12} 这种格式的请求体,需要配置请求头 'Content-Type':'application/json;charset=UTF-8' 注意: 请求体格式和请求头的Content-Type类型必

开发人员看测试之运行Github中的JBehave项目

本文要阐述的主要有两点,一是介绍自动化测试框架JBehave,二是介绍如何在Github上拉项目,编译成myeclipse环境中的项目,并最终导入Myeclipse中运行. JBehave是何物? JBehave是基于BDD框架的开源自动化测试框架.提供Web集成的BDD层扩展. JBehave特征: JBehave是纯Java实现,可以利用Java丰富的API为己所用: 具有基于文本的story,可以对其进行定义并执行,比较灵活和易扩展: 基于注解(Annotation)的运行配置信息,指定s

angular的GitHub Repository Directive Example学习

angular的GitHub Repository Directive Example学习 运行下面代码 <!DOCTYPE html><html ng-app="myApp"><head>     <meta charset="utf-8" />     <title>GitHub Repository Directive Example</title>       <script sr

深入理解jQuery、Angular、node中的Promise

最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供基础功能.在用jQuery操作DOM的时候对Promise的使用欲不够强烈,最近学习node和Angular,需要用js写业务逻辑和数据操作代码的时候这种场景需求就出来了.一般来说事件适合在交互场景中运用,因为用户的行为本来就是分散的,而promise这样的流程控制适合在后台逻辑中处理业务. //j

MVVM模式解析和在WPF中的实现(三) 命令绑定

MVVM模式解析和在WPF中的实现(三) 命令绑定 0x00 命令绑定要达到的效果 命令绑定要关注的核心就是两个方面的问题,命令能否执行和命令怎么执行.也就是说当View中的一个Button绑定了ViewModel中一个命令后,什么时候这个Button是可用的,按下Button后执行什么操作.解决了这两个问题基本就实现了命令绑定.另外一个问题就是执行过程中需要的数据(参数)要如何传递.本次主要探讨这几个问题. 0x01 命令绑定的实现 自定义一个能够被绑定的命令需要实现ICommand接口.该接

Oracle OCP之硬解析在共享池中获取内存锁的过程

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38684819 1.获得library cache Latch (1)在父游标的名柄没有找到SQL语句的文本:select * from gyj_t1 where id=1; 2.释放library cache Latch 3.获得shared pool Latch     (1)搜索FreeList 空闲Chunk     (2)搜索LRU上可覆盖的chunk     (3)搜索R-Fr

github中fork分支怎么同步源库

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd