[转]Cordova + Ionic in Visual Studio - 101 Tutorial [Part I]

本文转自:http://binarylies.ghost.io/cordova-ionic-in-visual-studio/

 

Hi everyone,

I thought about lending a hand to all the people that are, as I have been recently, exploring Cordova and all its features for the first time.

For the ones still trying to figure out what Apache Cordova is, I'll try to briefly explain it to you.

Apache Cordova

Apache Cordova (or Adobe PhoneGap) is a platform that provides hybrid mobile web development technology so you can build native mobile applications using HTML, CSS and JavaScript. Basically, Cordova provides a native application hosting a full screen Web View where you'll develop your web app.

Alongside this, Cordova provides a plugin Javascript API that allows you to access native features and API's. Currently there are hundreds of plugins available for you to use or, of course, you can build your own. The compatibility of the existing plugins may vary, but most of them are available to the iOS and Android platforms.

Cordova for Visual Studio

Recently Microsoft released Visual Studio Tools for Apache Cordova. With these tools you can integrate your development process from coding and building to debugging in this powerful IDE.

Clarifying the last point, debug in Visual Studio is available for Android (>= 4.4), iOS (it provides a remote iOS build and debugging agent that interfaces with XCode’s command line build tools - a Mac and Apple Developer Account is required to build and debug) and apparently with the most recent update to this toolset it is also possible to debug Windows Phone 8.1.

Let me be clear: both Apache Cordova and Cordova Tools for Visual Studio still have [a lot of] limitations. I've banged my head against the wall figuring out a way to work around some issues. However, this will not be the subject of today's post, and let's admit, having a platform, a free one, that allows you to write code once and publish it for several devices, and still manage to keep the mobile touch and feel is pretty cool, even with a few shortcomings.

Requirements

As you have certainly understood by now, my demonstration will be based on Visual Studio, but if you're using the command line, you can follow this too. You just have to replace the visual studio actions with the respective cordova commands.

So, this is what I'm gonna use to show you a basic cordova project:

  • HTML5 & JavaScript (makes sense, right? if you don't know them, you should probably stop here, and come back when you do)
  • AngularJS (you don't need to be a pro - I'm certainly not - but you should have a basic knowledge of it)
  • Ionic  (Open source library of  HTML, CSS and JS components, gestures, and tools optimized for mobile)
  • Bower (You should have nodejs + npm installed to install bower)

If you're using Visual Studio, these are your requirements:

  • Visual Studio 2013 + Update 4
  • Visual Studio Tools for Apache Cordova CTP3.1

or

  • Visual Studio 2015 CTP6

Ready, Set, Let's Go!

First, you've to create your blank project. If you're using Visual Studio (after you install everything required), you'll have to go to: File > New > Project > And then look for the Apache Cordova Apps templates under JavaScript.

Visual Studio Apache Cordova Apps template

Then, and I remind you that you should have nodejs + npm + bower installed, you're going to open a command line inside your project's folder and do > bower init. Here you may just keep the defaults, by pressing enter a few times. At this point we have our project initiated. But pretty empty. Your project should look like the this:

Project structure on Visual Studio

Let's install ionic now, using bower: 

> bower install driftyco/ionic-bower#master --save

And after installing, we're adding ionic references to our index.html. I'll be adding ionic.bundle, which includes Ionic scripts as well as AngularJS.

    <!-- BinaryLiesApp references --><link href="bower_components/ionic/css/ionic.css" rel="stylesheet" /> <!-- (...) --> <script src="bower_components/ionic/js/ionic.bundle.js"></script> 

Right now, we should have all we need to run our app (Yey!). We should show something more interesting than the default Hello, your application is ready! text though. Let's put ionic to work, and add a header. Your index.html should look like this for the moment:

<!DOCTYPE html>  
<html> <head> <meta charset="utf-8" /> <title>BinaryLiesApp</title> <!-- BinaryLiesApp references --> <link href="bower_components/ionic/css/ionic.css" rel="stylesheet" /> <link href="css/index.css" rel="stylesheet" /> </head> <body> <div class="bar bar-header bar-positive"> <h1 class="title">Binary Lies</h1> </div> <!-- Cordova reference, this is added to your app when it's built. --> <script src="cordova.js"></script> <script src="scripts/platformOverrides.js"></script> <script src="bower_components/ionic/js/ionic.bundle.js"></script> <script src="scripts/index.js"></script> </body> </html> 

If you try to run it, you should see something like the next image. I used ripple in this case, which is another tool that comes with Visual Studio Tools for Cordova, but you can always run it directly to your device.

App state by the moment

Ok guys, now that we have it all running, let's start creating our app shall we? We start by doing what we would do in any other web app, build it from the ground up!

I'll be using angular, which binds very well with ionic. You can use whatever structure you feel more comfortable with. As for me, I started by creating a folder app where I'm gonna put all my angular related files, i.e. my controllers, services, directives and template files. It looks like this: App angular structure

In the app.js file, besides registering my services and controllers, and defining my routes, I'm gonna inject the ionic service.

var app = angular.module('BinaryLiesApp', ['ionic', 'angularMoment']); 

I'm doing one more thing in here. I'm going to manually initiate angular, only when the device is ready.

Why am I doing this? Well, further ahead we're gonna use some device services that are only available after the device is ready. So, to avoid having some troubles trying to use services not yet available, you can either have a specific service that you call to check if the device is ready for you to use, and this is probably the most efficient way to do this, or... you can bootstrap your app only after the device ready event fires. For what I'm going to show you in this post, this approach will be enough.

var onDeviceReady = function () { console.log("Application start"); angular.bootstrap(document.body, ['BinaryLiesApp']); } document.addEventListener('deviceready', onDeviceReady.bind(this), false); 

In my routes, I set up an abstract state using menu.html template. This will be the main template and AppController will be the parent controller:

.state('app', { url: "/app", abstract: true, templateUrl: "app/templates/menu.html", controller: 'AppController' }) 

So let's draw the menu using Ionic, namely ionic directives. The side menu directive goes like this:

<ion-side-menus>  <ion-side-menu-content> <!-- 01. Here goes the view content --> </ion-side-menu-content> <ion-side-menu side="left" expose-aside-when="large"> <!-- 02. While in here goes the menu contents --> </ion-side-menu> </ion-side-menus> 

In the menu zone (02.), you can see that it's possible to define the menu side and there's another attribute there, expose-aside-when, to keep the side menu open when you're accessing the app from a 'large' device. Useful for tablets for instance. Inside this area, we'll draw a header - using an ionic angular directive - and the content of the menu, which is a list of menu options.

<header class="bar bar-positive menu-header bar-header bar-stable"> <!-- Here is our positive header, with our title inside--> <h2>Binary Lies</h2> </header> <ion-content class="has-header menu-header"> <!-- Here we have a ion-content directive. You'll see it more times with a list of items. These items have an 'item-icon-left' class, so they adjust to the ionicon that we're adding to each item--> <ion-list> <ion-item nav-clear item-icon-left menu-close href="#/app/posts"> <i class="icon ion-ios-paper"></i> Blog Posts </ion-item> <ion-item nav-clear item-icon-left menu-close href="#/app/favorites"> <i class="icon ion-ios-heart"></i> Favorites </ion-item> </ion-list> </ion-content 

Back to the view contents (01.). First, we should have a navigation bar that will hold our title and some buttons for quick actions, and then the container for the views.

<ion-nav-bar class="bar bar-positive nav-title-slide-ios"> <!-- Here again our positive bar. And back button (required for the iOS platforms --> <ion-nav-back-button class="button-clear"><i class="icon ion-ios-arrow-back horizontal-padd-5"></i></ion-nav-back-button> <ion-nav-buttons side="right"> <!-- And some buttons, on the right side of the nav-bar --> <button class="button button-icon icon ion-ios-search-strong"> </button> <button class="button button-icon icon ion-android-more-vertical"></button> </ion-nav-buttons> </ion-nav-bar> <!-- And down here we have the container for the view content --> <ion-nav-view name="menuContent" animation="slide-left-right"></ion-nav-view> 

This is our menu, but now we have to show some content views. Our default view (app.js) is going to be a list of blog posts.

.state('app.posts', { url: "/posts", views: { 'menuContent': { templateUrl: "app/templates/posts.html", controller: 'PostsController' } } }); $urlRouterProvider.otherwise('/app/posts'); 

Our PostsController.js will be fed by a PostsService.

var PostsService = ['$http', '$q', function ($http, $q) { var self = this; self.Posts = []; this.GetPosts = function () { // You would probably want to make a $http request here to obtain your data self.Posts = [ { Id: 1, Title: "Sinatra Tests 101 - RSpec", Date: new Date("2015-03-16"), Author: "Tiago Casanova", ImageUrl:"http://blog.softartisans.com/wp-content/uploads/2012/03/sinatraruby.jpg" }, { Id: 2, Title: "Sinatra Tests 101 - MiniTest", Date: new Date("2015-03-31"), Author: "Tiago Casanova", ImageUrl:"http://blog.softartisans.com/wp-content/uploads/2012/03/sinatraruby.jpg" }, { Id: 3, Title: "Cordova + Ionic in Visual Studio - 101 Tutorial [Part I]", Date: new Date("2015-04-20"), Author: "Joana Barbosa", ImageUrl: "https://xrgqhq.dm2302.livefilestore.com/y2pFCNt436TcSShqnPwputyXorHc1Szo8rwrJJzMXp9NWUWYFvGtm3BlG95ohv2MvaCHJo63vD87xgJiu7fw_aNmzR9lceKyXymu7f3ZUFXP4dd2XS41CN-celCPvaJ1wDogkcicT0Q1Es07g6O_o7iHw/cordova_p1_header.png?psid=1" }, { Id: 4, Title: "Sinatra Tests 101 - Cucumber", Date: new Date("2015-04-27"), Author: "Tiago Casanova", ImageUrl: "http://tinyurl.com/ppms8cu" } ]; return self.Posts; } }]; 

For today's demo, I'm using local static data. Of course, this should be replaced by your http request.

My controller will also be very simple. 

"use strict";
var PostsController = ['$scope', 'postsService', function ($scope, postsService) { var self = this; $scope.model = { posts: [] }; self.Init = function () { $scope.model.posts = postsService.GetPosts(); } self.Init(); }]; 

By now, I already have all data available to show in my view. Let's use ionic to display it. 

<ion-view title="Posts"> <ion-nav-buttons side="left"> <!-- Here we're adding a button to toggle the side menu--> <button menu-toggle="left" class="button button-icon icon ion-navicon"></button> </ion-nav-buttons> <ion-content class="center" ng-show="model.posts.length==0"> <!-- 03. Loading content--> <div class="row"> <ion-spinner></ion-spinner> </div> </ion-content> <ion-content class="has-header" ng-hide="model.posts.length==0"> <!-- 04. List of posts--> <ion-list> <ion-item ng-repeat="item in model.posts" class="item-thumbnail-left" href="#/app/post/{{item.Id}}"> <img ng-src="{{item.ImageUrl}}"> <h2>{{item.Title}}</h2> <p>{{item.SubTitle}}</p> <p>{{item.Date | amCalendar}}</p> </ion-item> </ion-list> </ion-content> </ion-view> 

I added the first ion-content (03.) to show an ionic-spinner while the user is waiting for the posts' data to be loaded. And after that one, we got our post list(04.). We're using an ionic class to present the list with a left thumbnail while also using an angular-moment filter to display the post date.

This post is getting too big, so I'm stopping here. By now you should have an app with a left-side menu, with one view, presenting the list of the posts.

It should look like this. Not bad, right? Final look

We've built our basic skeleton but this was just the start. We haven't messed up with cordova plugins to interact with the device yet! I promise I'll show you more of that in the next part of this tutorial.

Thank you for reading.

Take care! See you in the next one ;)

Joana Barbosa

Junior BI & Web Developer @ Devscope, learning to knock data out using BI! As a web enthusiast, I'm always interested in exploring new Web tools and technologies.

Porto, Portugal                     https://twitter.com/JoanaVBarbosa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】学会这13个原则写UI界面文案,用户才能秒懂

原文网址&#xff1a;http://www.niaogebiji.com/article-12011-1.html 摘要: 首先&#xff0c;在写UI文案之前&#xff0c;为了理清思路&#xff0c;要先搞清楚三个问题&#xff1a;我&#xff08;设计师&#xff09;想让用户做什么&#xff1f; – 我写文案的目的为什么要让用…

【前端就业课 第一阶段】HTML5 零基础到实战(一)基础代码结构详解

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

【框架篇】mvc、mvp、mvvm使用关系总结

MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c…

Android之使用自定义华为扫描SDK扫描二维码和识别本地图片

1、需求 更具UI的设计实现扫描二维码和识别本地图片二维码功能。 zxing扫描二维码还可以,但是识别本地图片二维码功能效果太差,非常不理想,看了看多github很多zxing扩展的开源项目,识别本地图片二维码功能效果不乐观,有些甚至还有裁剪本地图片,还是不能识别,果断放弃zb…

Matlab R2016b简体中文版安装教程(附Matlab R2016b百度网盘下载地址)

下载的Matlab R2016b软件安装包(文末附有下载地址)目录如下所示: 安装过程: 1. 安装主程序R2016b_win64_dvd1.iso和R2016b_win64_dvd2.iso 由于目前大多数及其都是Win8或10系统,所以选中R2016b_win64_dvd1.iso,右键→Windows资源管理器打开。Win7系统可以安装好压软件之后…

深度学习String、StringBuffer、StringBuilder

相信String这个类是Java中使用得最频繁的类之一&#xff0c;并且又是各大公司面试喜欢问到的地方&#xff0c;今天就来和大家一起学习一下String、StringBuilder和StringBuffer这几个类&#xff0c;分析它们的异同点以及了解各个类适用的场景。下面是本文的目录大纲&#xff1a…

MySQL5.5多实例编译安装——mysqld_multi

一、MySQL多实例简介 MySQL多实例&#xff0c;简单地说&#xff0c;就是在一台服务器上同时开启多个不同的服务端口&#xff08;如&#xff1a;3306、3307&#xff09;&#xff0c;同时运行多个MySQL服务进程&#xff0c;这些服务进程通过不同的socket监听来自不同的端口来提供…

【前端就业课 第一阶段】HTML5 零基础到实战(二)超链接

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

C语言,C#语言求100-999内的水仙花数源程序

水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09;&#xff0c;水仙花数是指一个 3 位数&#…

算法马拉松13 A-E解题报告

A题意&#xff08;取余最长路&#xff09;: 佳佳有一个n*m的带权矩阵&#xff0c;她想从(1,1)出发走到(n,m)且只能往右往下移动&#xff0c;她能得到的娱乐值为所经过的位置的权的总和。 有一天&#xff0c;她被下了恶毒的诅咒&#xff0c;这个诅咒的作用是将她的娱乐值变为对p…

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为 MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Jav…

在微信小程序中使用“随机键盘”

最近研究微信小程序&#xff0c;发现在手机上使用系统键盘非常不方便&#xff0c;一是按键太小&#xff0c;对于小学生来说&#xff0c;操作非常不方便&#xff1b;二是系统键盘反复切换影响界面布局。于是自己决定自己写一个随机的小键盘。 原理非常简单&#xff1a;拿“口算练…

Android之提示订阅配置订阅需要传新的包 添加结算权限。

1 问题 apk上google应用市场&#xff0c;然后开通支付商品&#xff0c;错误提示如下 2 解决办法 AndroidManifest.xml里面添加谷歌支付权限 <!-- google pay --><uses-permission android:name"com.android.vending.BILLING" />

【前端就业课 第一阶段】HTML5 零基础到实战(三)一篇文CSS基础入门

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

将VNC 安装在Centos 7步骤

&#xff08; Virtual Network Computing&#xff09;VNC允许Linux系统可以类似实现像Windows中的远程桌面访问那样访问Linux桌面。本文配置机器是兴宁市网络信息中心的一台Centos 7 HP服务器环境下运行。 首先试试服务器装了VNC没 [rootwic ~]# rpm -q tigervnc tigervnc-serv…

Google 开源的 Android 排版库:FlexboxLayout

最近Google开源了一个项目叫「FlexboxLayout」。1.什么是 Flexbox简单来说 Flexbox 是属于web前端领域CSS的一种布局方案&#xff0c;是2009年W3C提出了一种新的布局方案&#xff0c;可以简便、完整、响应式地实现各种页面布局&#xff0c;并且 React Native 也是使用的 Flex 布…

再见 KataCoda——O'Reilly 宣布其将在六月份关闭

近日听闻 OReilly 将永久关闭在线学习网站 KataCoda&#xff0c;对于广大程序员和学习者来说&#xff0c;这无疑是一件痛心疾首的事情&#xff0c;以后我们再也看不到那只会变成的功夫猫了。KataCoda 简介KataCoda 成立于 2016 年&#xff0c;它是一个在线学习平台&#xff0c;…

中国区域Modis行列号(附Shapefile文件下载)

重磅&#xff1a;Landsat中国西北地区行列号Shapefile图层对照&#xff08;附行列号Shapefile下载&#xff09; 全球&#xff1a; 中国&#xff1a;

【前端就业课 第一阶段】HTML5 零基础到实战(四)伪类与伪元素

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

编写第一个响应式页面

2019独角兽企业重金招聘Python工程师标准>>> 本文为大家讲解如何使用一种科学的方法实现网页设计&#xff0c;从原理上搞清楚什么是响应式设计&#xff0c;并实现一个简易的响应式设计框架&#xff0c;以此为基础&#xff0c;编写出第一个响应式页面。 不知道现在大…