基於ionic+angulajs的混合開發實現地鐵APP

基於ionic+angulajs的混合開發實現地鐵APPcss

注:本博文爲博主原創,轉載時請註明出處。html

項目源碼地址:https://github.com/zhangxy1035/SubwayMapandroid

    1、項目簡介ios

    在該項目中的地鐵app是基於ionic+angularjs開發的一款軟件,其中使用了高德地圖的開放接口(地鐵JS API)網址爲:http://lbs.amap.com/api/subway-api/subway-summary/。在該app中主要實現了,地鐵線路圖的總體展現,起點終點設置,界面清空,線路查詢,出發地與目的地線路查詢等功能。本博文適合對ionic1有必定了解的人學習實踐。具體能夠參照ionic學習中文網址http://www.ionic.wang/git

    2、項目演示angularjs

    項目中的界面風格整體比較清爽,界面以下:(以北京地鐵爲例)github

    在上述圖片中依次是,地鐵圖展現,起點終點設置,線路查詢,以及出發地目的地查詢。 web

 

    3、項目構建apache

    因爲本項目所用的是ionic1,因此必須瞭解,ionic是如何建立項目的。gulp

    首先在本身的電腦上必須安裝ionic,而後到本身的項目目錄下(以建立項目名稱爲subway爲例),在cmd中運行以下命令

    ionic start subway    //建立名稱爲subway的項目

    cd subway        //進入subway目錄下

    ionic platfrom add android  //添加android平臺

    ionic build android      //在該平臺下進行編譯(提示一點,首次能夠進行編譯,可是當你每次修改完項目中的www文件時須要從新進行編譯。)

    項目的目錄以下圖:

 


    其中www文件夾下,存儲的爲項目中的主要代碼,包括css,js,html等。接下來爲你們逐一介紹,每一個文件夾以及重要的函數說明:(在這個項目中,博主start了一個新的ionic項目,其中的文件名稱都是沒有改過的,屬於ionic 默認的tab佈局以及tab中的文件名稱。)這個www文件直接能夠再本項目源碼中下載查看。

    index.html

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4   <meta charset="utf-8">
 5   <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
 6   <title></title>
 7 
 8   <link href="lib/ionic/css/ionic.css" rel="stylesheet">
 9   <link href="css/style.css" rel="stylesheet">
10 
11   <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above
12   <link href="css/ionic.app.css" rel="stylesheet">
13   -->
14   <!--<script src="http://webapi.amap.com/js/marker2.js"></script>-->
15   <script src="http://webapi.amap.com/subway?v=1.0&key=你的key&callback=cbk"></script>
16 
17   <!-- ionic/angularjs js -->
18   <script src="lib/ionic/js/ionic.bundle.js"></script>
19 
20   <!-- cordova script (this will be a 404 during development) -->
21   <!--<script src="cordova.js"></script>-->
22 
23   <!-- your app's js -->
24   <script src="js/app.js"></script>
25   <script src="js/controllers.js"></script>
26   <script src="js/services.js"></script>
27 </head>
28 <body ng-app="starter">
29 <!--
30   The nav bar that will be updated as we navigate between views .
31 -->
32 <ion-nav-bar class="bar-positive bar-footer">
33 
34 </ion-nav-bar>
35 <!--
36   The views will be rendered in the <ion-nav-view> directive below
37   Templates are in the /templates folder (but you could also
38   have templates inline in this html file if you'd like).
39 -->
40 <ion-nav-view></ion-nav-view>
41 <ion-nav-back-button>
42 </ion-nav-back-button>
43 </body>
44 </html>
View Code

    其中在代碼中有一個須要寫入高德開發者的key,代碼以下:

    <script src="http://webapi.amap.com/subway?v=1.0&key=你的key&callback=cbk"></script>

    其中的cbk能夠進行修改,可是須要與js中引入的函數名稱保持一致。

    具體key如何申請,請查看網站高德開發者接口文檔:http://lbs.amap.com/

    接下來在以下圖所示的文件中,代碼中涉及了angularjs的雙向綁定,以及如何引入高德的map等。

  

    app.js

  1 // Ionic Starter App
  2 
  3 // angular.module is a global place for creating, registering and retrieving Angular modules
  4 // 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)
  5 // the 2nd parameter is an array of 'requires'
  6 // 'starter.services' is found in services.js
  7 // 'starter.controllers' is found in controllers.js
  8 angular.module('starter', ['ionic', 'starter.controllers', 'starter.services'])
  9   // .constant("CONFIG",{
 10   //   host: "",//地址
 11   //   version:'1.0.0'//版本
 12   // })
 13 
 14 .run(function($ionicPlatform) {
 15   $ionicPlatform.ready(function() {
 16     // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
 17     // for form inputs)
 18     if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
 19       cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
 20       cordova.plugins.Keyboard.disableScroll(true);
 21 
 22     }
 23     if (window.StatusBar) {
 24       // org.apache.cordova.statusbar required
 25       StatusBar.styleDefault();
 26     }
 27   });
 28 })
 29 
 30   .config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) {
 31 
 32     $ionicConfigProvider.platform.ios.tabs.style('standard');
 33     $ionicConfigProvider.platform.ios.tabs.position('bottom');
 34     $ionicConfigProvider.platform.android.tabs.style('standard');
 35     $ionicConfigProvider.platform.android.tabs.position('standard');
 36 
 37     $ionicConfigProvider.platform.ios.navBar.alignTitle('center');
 38     $ionicConfigProvider.platform.android.navBar.alignTitle('left');
 39 
 40     $ionicConfigProvider.platform.ios.backButton.previousTitleText('').icon('ion-ios-arrow-thin-left');
 41     $ionicConfigProvider.platform.android.backButton.previousTitleText('').icon('ion-android-arrow-back');
 42 
 43     $ionicConfigProvider.platform.ios.views.transition('ios');
 44     $ionicConfigProvider.platform.android.views.transition('android');
 45 
 46 
 47     // Ionic uses AngularUI Router which uses the concept of states
 48     // Learn more here: https://github.com/angular-ui/ui-router
 49     // Set up the various states which the app can be in.
 50     // Each state's controller can be found in controllers.js
 51     $stateProvider
 52 
 53     // setup an abstract state for the tabs directive
 54       .state('tab', {
 55         url: "/tab",
 56         abstract: true,
 57         templateUrl: "templates/tabs.html"
 58       })
 59 
 60       // Each tab has its own nav history stack:
 61 
 62       .state('tab.dash', {
 63         url: '/dash',
 64         views: {
 65           'tab-dash': {
 66             templateUrl: 'templates/tab-dash.html',
 67             controller: 'DashCtrl'
 68           }
 69         }
 70       })
 71 
 72       .state('tab.chats', {
 73         url: '/chats',
 74         views: {
 75           'tab-chats': {
 76             templateUrl: 'templates/tab-chats.html',
 77             controller: 'ChatsCtrl'
 78           }
 79         }
 80       })
 81       .state('tab.chat-detail', {
 82         url: '/chats/:chatId',
 83         views: {
 84           'tab-chats': {
 85             templateUrl: 'templates/chat-detail.html',
 86             controller: 'ChatDetailCtrl'
 87           }
 88         }
 89       })
 90 
 91       .state('tab.account', {
 92         url: '/account',
 93         views: {
 94           'tab-account': {
 95             templateUrl: 'templates/tab-account.html',
 96             controller: 'AccountCtrl'
 97           }
 98         }
 99       });
100 
101     // if none of the above states are matched, use this as the fallback
102     $urlRouterProvider.otherwise('/tab/dash');
103 
104   });
View Code

    在此說明一點,在實際開發過程當中home-tab可能會出現的頂部,解決的辦法,就是將上述app代碼中的.config中的代碼進行復制,就不會出現這種問題。

    controller.js

 1 angular.module('starter.controllers', [])
 2 
 3 .controller('DashCtrl', function($scope) {
 4   var mysubway='';
 5   window.cbk = function(){
 6     mysubway = subway("mysubway",{
 7       easy: 1,
 8       adcode: '1100'
 9     });
10 
11     mysubway.event.on("subway.complete", function () {
12       // mysubway.addInfoWindow('南鑼鼓巷');
13       var center = mysubway.getStCenter('南鑼鼓巷');
14       mysubway.setCenter(center);
15     });
16     $scope.subwaycle = function () {
17       mysubway.clearInfoWindow();
18       mysubway.clearRoute();
19     }
20 
21     console.log(mysubway);
22   };
23 
24 
25 
26 })
27 
28 .controller('ChatsCtrl', function($scope) {
29   window.cbk = function(){
30     var mysubway = subway("mysubway",{
31       easy: 1,
32       adcode: '1100'
33     });
34     $scope.subwayserch={
35       sub:''
36     };
37 
38     mysubway.event.on("subway.complete", function () {
39       // var id = mysubway.getIdByName('8號線', 'line');
40       mysubway.showLine($scope.subwayserch.sub);
41       var $select_obj = document.getElementById('g-select');
42       // mysubway.setFitView($select_obj);
43       var center = mysubway.getSelectedLineCenter();
44       mysubway.setCenter(center);
45 
46     });
47   $scope.subways = function(){
48     mysubway.clearInfoWindow();
49     mysubway.clearRoute();
50     mysubway.showLine($scope.subwayserch.sub);
51     var center = mysubway.getSelectedLineCenter();
52     mysubway.setCenter(center);
53   };
54     console.log(mysubway);
55   };
56 
57 })
58 
59 .controller('ChatDetailCtrl', function($scope, $stateParams, Chats) {
60   $scope.chat = Chats.get($stateParams.chatId);
61 })
62 
63 .controller('AccountCtrl', function($scope) {
64   window.cbk = function(){
65     var mysubway = subway("mysubway",{
66       easy: 1,
67       adcode: '1100000'
68     });
69   $scope.person={
70     start:'北土城',
71     end:'天安門西'
72   }
73     $scope.start='北土城';
74     $scope.end='天安門西';
75     mysubway.event.on("subway.complete", function () {
76 
77       mysubway.setStart($scope.person.start);
78       mysubway.setEnd($scope.person.end);
79 
80       mysubway.route($scope.start, $scope.person.end, {
81         closeBtn: true
82       });
83       $scope.changeSE = function () {
84         mysubway.setStart($scope.person.start);
85         mysubway.setEnd($scope.person.end);
86         mysubway.route($scope.person.start, $scope.person.end, {
87           closeBtn: true
88         });
89       }
90     });
91   };
92 
93 });

    tab-dash.html

1 <ion-view view-title="地鐵圖">
2   <div style="position:absolute;z-index: 1">
3     <div id="mysubway" style="width:auto;height: auto"></div>
4     <div style="margin-top:27rem;margin-right:5rem;position:absolute;z-index:1000">
5       <button class="button button-positive " ng-click="subwaycle()" ><b>清除</b></button>
6     </div>
7   </div>
8 </ion-view>

    tab-dash.html頁面對應的是controller中的DashCtrl,這個頁面中所定的需求主要是項目演示中的1圖所示,能夠進行起點終點的設置,而且在頁面移動地鐵圖時,圖上的「清除」按鈕不會移動,當點擊按鈕以後,會直接清除地圖上的全部路徑設置,主要控制的代碼爲: mysubway.clearInfoWindow(); mysubway.clearRoute();這兩個函數分別是清除信息窗口,清除路徑。在頁面設置上,爲了使得按鈕不會根據地圖的移動而移動,設置了一個z-index,層級設置能夠很好的對頁面進行控制。

    接下來再介紹一下項目中的出發地與目的地查詢界面。頁面代碼以下:

    tab-account.html

 1 <ion-view view-title="歸去來兮">
 2   <div style="position:absolute;z-index: 1">
 3     <div id="mysubway" style="width:auto;height: auto"></div>
 4     <div style="margin-top:3rem;margin-right:20rem;position:absolute;z-index:1000;">
 5         <input type="text" ng-model="person.start" style="color: #4d4d4d"  placeholder="起點">
 6         <input type="text" ng-model="person.end"  placeholder="終點">
 7       <button class="button  button-positive " ng-click="changeSE()" ><b>確認</b></button>
 8     </div>
 9   </div>
10 </ion-view>

    其中tab-account.html頁面的控制器是AccountCtrl,在controller的代碼中

    mysubway.setStart($scope.person.start);//設置起點
    mysubway.setEnd($scope.person.end);//設置終點

    mysubway.route($scope.start, $scope.person.end, {closeBtn: true});//根據所設置的起點終點繪製路線。

    controlle.js中的代碼比較重要,其中包含了如何顯示地圖,以及如何控制雙向綁定,在這裏給你們提醒一點,angularjs的雙向綁定有時候會莫名其妙的出現問題,用下面這種方法就能夠很好的避免,頁面中引用的時候{{subwayserch.sub}},或者ng-model=subwayserch.sub,這樣便不會出現問題。

1  $scope.subwayserch={
2        sub:''
3     };

    4、項目總結

     就本項目而言,只是實現了較少的功能,具體的能夠參考高德的開發接口。根據開發接口在本項目的基礎上能夠實現更多的功能。看到本博文感興趣的快去實踐吧。參考資料以下:ionic學習網站:http://www.ionic.wang/,高德開發者接口網站:http://lbs.amap.com/

相關文章
相關標籤/搜索