关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程。 这一讲主要实现生活和农业两大模块的实现,在这个过程中,对service层提取出一个公用的BaseService。

这一讲分为三大模块:

  • 一.提取公用的服务层BaseService
  • 二.生活模块Tab3的实现
  • 三.农业模块Tab4的实现

一.提取公用的服务层BaseService

将doRefresh和loadMore函数封装到BaseService,供其他模块使用。

BaseService的实现
  1. .service('BaseService', function ($http) {
  2. this.loadMore = function ($this) {
  3. console.log("正在加载更多数据..." + $this.page);
  4. $http.get($this.url + "?page=" + $this.page + "&rows=" + settings.rows).success(function (response) {
  5. console.log(response);
  6. if (response.tngou.length > 0) {
  7. $this.items = $this.items.concat(response.tngou);
  8. $this.page++;
  9. } else {
  10. console.log("没有数据了...")
  11. $this.isload = true;
  12. }
  13. $this.callback();
  14. });
  15. }
  16. this.doRefresh = function ($this) {
  17. console.log("正在执行refresh操作...");
  18. $http.get($this.url + "?page=1&rows=" + settings.rows).success(function (response) {
  19. console.log(response);
  20. $this.page = 2;
  21. $this.items = response.tngou;
  22. $this.callback();
  23. $this.isload = false;
  24. });
  25. }
  26. })

二.生活模块的实现

生活模块的controller实现和service的实现.

[效果图]

1.service层Tab3Service的实现

在Tab3Service中通过依赖注入实现对BaseService的doRefresh和loadMore的调用。

  1. .service('Tab3Service', function (BaseService) {
  2. this.getTab3Menu = function () {
  3. return [
  4. {
  5. name: '社会热点', isload: true, url: server.domain + '/top/list', type: 'top',
  6. page: 1, rows: 20,
  7. items: [],
  8. loadMore: function () {
  9. BaseService.loadMore(this);
  10. },
  11. doRefresh: function () {
  12. BaseService.doRefresh(this);
  13. },
  14. callback: function () {
  15. //回掉函数
  16. }
  17. },
  18. {
  19. name: '健康菜谱', isload: true, url: server.domain + '/cook/list', type: 'cook',
  20. page: 1, rows: 20,
  21. items: [],
  22. loadMore: function () {
  23. BaseService.loadMore(this);
  24. },
  25. doRefresh: function () {
  26. BaseService.doRefresh(this);
  27. },
  28. callback: function () {
  29. //回掉函数
  30. }
  31. },
  32. {
  33. name: '健康食品', isload: true, url: server.domain + '/food/list', type: 'food',
  34. page: 1, rows: 20,
  35. items: [],
  36. loadMore: function () {
  37. BaseService.loadMore(this);
  38. },
  39. doRefresh: function () {
  40. BaseService.doRefresh(this);
  41. },
  42. callback: function () {
  43. //回掉函数
  44. }
  45. }
  46. ]
  47. }
  48. })
2.controller层Tab3Ctrl控制器的实现
  1. .controller('Tab3Ctrl', function ($scope, Tab3Service, $controller, $state, $ionicTabsDelegate) {
  2. $scope.classify = Tab3Service.getTab3Menu()
  3. $scope.currentTabId = "tab3";
  4. $controller('BaseCtrl', { $scope: $scope });
  5. $scope.goDetails = function (item, type) {
  6. var title = "", name = "";
  7. if (item.title) {
  8. title += item.title;
  9. }
  10. if (item.name) {
  11. title += item.name;
  12. }
  13. console.log(item);
  14. $state.go('tab.tab3-details', { id: item.id, title: title, type: type })
  15. $ionicTabsDelegate.showBar(false);
  16. }
  17. })
3.tab3.html和tab3-details.html的视图实现

tab3.html

  1. <ion-view view-title="生活">
  2. <ion-slide-box show-pager="false" on-slide-changed="slideChanged($index)">
  3. <ion-slide ng-repeat="slide in slides">
  4. <ion-content>
  5. <ion-refresher pulling-text="下拉刷新" on-refresh="slide.doRefresh()"></ion-refresher>
  6. <div class="list has-header">
  7. <a ng-repeat="item in slide.items" class="item item-thumbnail-right item-text-wrap" ng-click="goDetails(item,'{{slide.type}}')">
  8. <img ng-src="{{imgUrl+item.img}}" width="30" height="30" alt="">
  9. <h3>{{::item.title+item.name}}</h3>
  10. <p>{{::item.description | substring:item.description}}</p>
  11. </a>
  12. </div>
  13. <ion-infinite-scroll ng-if="!slide.isload" on-infinite="slide.loadMore()" distance="1%">
  14. </ion-infinite-scroll>
  15. </ion-content>
  16. </ion-slide>
  17. </ion-slide-box>
  18. <ion-tabs id="{{currentTabId}}" class="tabs-striped tabs-top">
  19. <ion-tab ng-repeat="item in tabs" on-select="selectedTab($index)" title="{{item.name}}"></ion-tab>
  20. </ion-tabs>
  21. </ion-view>

tab3-details.html

  1. <ion-view title="{{title}}">
  2. <ion-content class="padding">
  3. <div class="message" >
  4. <img ng-src="{{imgUrl+item.img}}" />
  5. <div ng-bind-html="item.message"></div>
  6. </div>
  7. </ion-content>
  8. </ion-view>
4.配置路由

在app.js中完善tab3的路由配置

  1. .state('tab.tab3', {
  2. url: '/tab3',
  3. views: {
  4. 'tab3': {
  5. templateUrl: 'templates/tab3.html',
  6. controller: 'Tab3Ctrl'
  7. }
  8. }
  9. })
  10. .state('tab.tab3-details', {
  11. url: '/tab/tab3-details/:id/:title/:type',
  12. views: {
  13. 'tab3': {
  14. templateUrl: 'templates/tab3-details.html',
  15. controller: 'Tab1DetailsCtrl'
  16. }
  17. }
  18. })

三.农业模块的实现

生活模块的controller实现和service的实现.

[效果图]

1.service层Tab4Service的实现

在Tab4Service中通过依赖注入实现对BaseService的doRefresh和loadMore的调用。

  1. .service('Tab4Service', function ($http, BaseService) {
  2. this.getTab4Menu = function () {
  3. return [
  4. {
  5. name: '农业新闻', isload: true, url: server.domain + '/news/list', type: 'news',
  6. page: 1, rows: 20,
  7. items: [],
  8. loadMore: function () {
  9. BaseService.loadMore(this);
  10. },
  11. doRefresh: function () {
  12. BaseService.doRefresh(this);
  13. },
  14. callback: function () {
  15. //回掉函数
  16. }
  17. },
  18. {
  19. name: '农业技术', isload: true, url: server.domain + '/tech/list', type: 'tech',
  20. page: 1, rows: 20,
  21. items: [],
  22. loadMore: function () {
  23. BaseService.loadMore(this);
  24. },
  25. doRefresh: function () {
  26. BaseService.doRefresh(this);
  27. },
  28. callback: function () {
  29. //回掉函数
  30. }
  31. }
  32. ]
  33. }
  34. this.getDetails = function (type, id) {
  35. var url = server.domain + "/" + type + "/show?id=" + id + "&callback=JSON_CALLBACK";
  36. return $http.jsonp(url);
  37. }
  38. })
2.controller层Tab4Ctrl控制器的实现
  1. .controller('Tab4Ctrl', function ($scope, Tab4Service, $controller, $state, $ionicTabsDelegate) {
  2. $scope.classify = Tab4Service.getTab4Menu()
  3. $scope.currentTabId = "tab4";
  4. $controller('BaseCtrl', { $scope: $scope });
  5. $scope.goDetails = function (item, type) {
  6. var title = "", name = "";
  7. if (item.title) {
  8. title += item.title;
  9. }
  10. if (item.name) {
  11. title += item.name;
  12. }
  13. console.log(item);
  14. $state.go('tab.tab4-details', { id: item.id, title: title, type: type })
  15. $ionicTabsDelegate.showBar(false);
  16. }
  17. })
3.tab3.html和tab3-details.html的视图实现

tab3.html

  1. <ion-view view-title="生活">
  2. <ion-slide-box show-pager="false" on-slide-changed="slideChanged($index)">
  3. <ion-slide ng-repeat="slide in slides">
  4. <ion-content>
  5. <ion-refresher pulling-text="下拉刷新" on-refresh="slide.doRefresh()"></ion-refresher>
  6. <div class="list has-header">
  7. <a ng-repeat="item in slide.items" class="item item-thumbnail-right item-text-wrap" ng-click="goDetails(item,'{{slide.type}}')">
  8. <img ng-src="{{imgUrl+item.img}}" width="30" height="30" alt="">
  9. <h3>{{::item.title+item.name}}</h3>
  10. <p>{{::item.description | substring:item.description}}</p>
  11. </a>
  12. </div>
  13. <ion-infinite-scroll ng-if="!slide.isload" on-infinite="slide.loadMore()" distance="1%">
  14. </ion-infinite-scroll>
  15. </ion-content>
  16. </ion-slide>
  17. </ion-slide-box>
  18. <ion-tabs id="{{currentTabId}}" class="tabs-striped tabs-top">
  19. <ion-tab ng-repeat="item in tabs" on-select="selectedTab($index)" title="{{item.name}}"></ion-tab>
  20. </ion-tabs>
  21. </ion-view>

tab4-details.html

  1. <ion-view title="{{title}}">
  2. <ion-content class="padding">
  3. <div class="message" ng-bind-html="item.message"></div>
  4. </ion-content>
  5. </ion-view>
4.配置路由

在app.js中完善tab4的路由配置

  1. .state('tab.tab4', {
  2. url: '/tab4',
  3. views: {
  4. 'tab4': {
  5. templateUrl: 'templates/tab4.html',
  6. controller: 'Tab4Ctrl'
  7. }
  8. }
  9. })
  10. .state('tab.tab4-details', {
  11. url: '/tab/tab4-details/:id/:title/:type',
  12. views: {
  13. 'tab4': {
  14. templateUrl: 'templates/tab4-details.html',
  15. controller: 'Tab1DetailsCtrl'
  16. }
  17. }
  18. })

难点和注意事项

  • 理解为什么要封装BaseService
  • 每个tab都有自己的tab-details,这么做的原因是各自用各自的路由管理,不会出现页面逻辑混乱。

到这里如果有任何问题,请通过文章最下面的联系方式联系我。

[ionic开源项目教程] - 第13讲 Service层优化,提取公用Service,以及生活和农业两大模块的实现的更多相关文章

  1. [ionic开源项目教程] - 第11讲 封装BaseController实现controller继承

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 截止到第10讲,tab1[健康]模块的功能基本已经完成了,但这一讲中,controller层又做了较大的改动,因为下一讲中t ...

  2. [ionic开源项目教程] - 第10讲 新闻详情页的用户体验优化

    目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...

  3. [ionic开源项目教程] - 第9讲 新闻详情页的实现

    目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...

  4. [ionic开源项目教程] - 第12讲 医疗模块的实现以及Service层loadMore和doRefresh的提取封装

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 这一讲主要实现tab2[医疗]模块,[医疗]模块跟tab1[健康]模块类似. [ionic开源项目教程] - 第12讲 医疗 ...

  5. [ionic开源项目教程] - 第14讲 ionic解决跨域问题

    [ionic开源项目教程] 第14讲 使用jsonp解决跨域问题 相信很多朋友在开发中都会遇到以下这个问题. No 'Access-Control-Allow-Origin' header is pr ...

  6. [ionic开源项目教程] - 第8讲 根据菜单分类加载数据(重要)

    [ionic开源项目教程] - 第8讲  根据菜单分类加载数据(重要) [效果图] 注意 今天遇到一个比较棘手的问题,就是左右滑动菜单的设计不合理性,所以tab1.html对应的视图层和control ...

  7. [ionic开源项目教程] - 第4讲 通Service层获取数据列表

    第4讲:通Service层获取数据列表 上一讲中页面的基本架构已完成,这一讲介绍如何通过service层从服务器请求数据,在通过controller层为载体,显示到视图层. 1.在services.j ...

  8. [ionic开源项目教程] - 第3讲 左右滑动菜单的实现(使用Tabs和SlideBox)

    使用Tabs和SlideBox实现左右滑动菜单 1.将tab1.html的代码改为如下: <ion-view view-title="健康"> <ion-cont ...

  9. [ionic开源项目教程] - 第2讲 新建项目,配置app.js和controllers.js搭建基础视图

    新建项目 由项目功能架构图选择合适的页面架构,这里选用Tab,ionic新建项目,默认的模板就是tab. $ ionic start TongeNews Creating Ionic app in f ...

随机推荐

  1. YTKNetwork

    YTKNetwork 是猿题库 iOS 研发团队基于 AFNetworking 封装的 iOS 网络库,其实现了一套 High Level 的 API,提供了更高层次的网络访问抽象. YTKNetwo ...

  2. 关于java调用linux shell 的问题

    问题的提出: shell脚本要做离线的数据处理任务 java调用脚本,将这种处理任务封装成webservice 特点: shell处理单个时间长 每次要处理文件量大 这里目前只做调用分析: 原来的: ...

  3. HDU 1403 Longest Common Substring(后缀数组,最长公共子串)

    hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小 ...

  4. 相对布局RelativeLayout

      一. public class RelativeLayout extends ViewGroup java.lang.Object    ↳ android.view.View      ↳ an ...

  5. android 四大组件Broadcast Receiver

    本文介绍Broadcast Receiver,包括几部分内容:Broadcast Receiver概述及实例.自定义Broadcast Receiver.Broadcast Receiver的实现细节 ...

  6. java重构、重载、重写

    重构:就是代码优化,或则你可以理解为代码的修改!            例:开始你的类名是A现在要改为B也称为重构的一种 重载:发生在同一类中,方法名相同,参数列表不同 重写:发生在父子类中,子类中有 ...

  7. easyUI Admin 模板

    http://www.oschina.net/p/Easy-Admin?fromerr=23Tfbale

  8. 添加dubbo xsd的支持

    使用dubbo时遇到问题: org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'htt ...

  9. iOS开发多线程--技术方案

    pthread 实现多线程操作 代码实现: void * run(void *param) {    for (NSInteger i = 0; i < 1000; i++) {         ...

  10. ios开发--企业帐号发布

    这两天需要发布一个ipa放到网上供其他人安装,需要用到企业级开发者账号. 首先详细说明一下我们的目标,我们需要发布一个ipa放到网上,所有人(包括越狱及非越狱设备)可以直接通过链接下载安装,不需要通过 ...