用ionicionic2 开发工具应用中,怎么在应用中加入IM

你正在使用的浏览器版本过低,将不能正常浏览和使用知乎。ionic开发Android App学习笔记(二) - 简书
ionic开发Android App学习笔记(二)
第一个ionic简例分析
上文中已经将ionic的开发环境搭建完毕,并且创建了一个带有tab页的项目。
运行效果图:
项目代码目录图:
项目代码目录图
ionic中是使用angularJs和ionic的页面组件来进行开发的,其代码的核心目录为上图中的www目录,代码一般都写在该目录下,主要是html,js和css文件。(上图中的hello.html文件不属于该项目,可忽略)
整个项目运作的流程如下:
1.用户请求应用起始页。
2.用户的浏览器向服务器发起一次HTTP 连接,然后加载index.html 页面,这个页面里面包含了模板。
3.Angular 被加载到页面中,等待页面加载完成,然后查找ng-app 指令,用来定义模板边界。
4.Angular 遍历模板,查找指令和绑定关系,这将触发一系列动作:注册监听器、执行一些DOM 操作、从服务器获取初始化数据。这项工作的最后结果是,应用将会启动起来,并且模板被转换成了DOM 视图。
5.连接到服务器去加载需要展示给用户的其他数据。
下面具体分析一下代码:
index.html
&!DOCTYPE html&
&meta charset="utf-8"&
&meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"&
&title&&/title&
&link href="lib/ionic/css/ionic.css" rel="stylesheet"&
&link href="css/style.css" rel="stylesheet"&
&!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above
&link href="css/ionic.app.css" rel="stylesheet"&
&!-- ionic/angularjs js --&
&script src="lib/ionic/js/ionic.bundle.js"&&/script&
&!-- cordova script (this will be a 404 during development) --&
&script src="cordova.js"&&/script&
&!-- your app's js --&
&script src="js/app.js"&&/script&
&script src="js/controllers.js"&&/script&
&script src="js/services.js"&&/script&
&body ng-app="starter"&
The nav bar that will be updated as we navigate between views.
&ion-nav-bar class="bar-stable"&
&ion-nav-back-button&
&/ion-nav-back-button&
&/ion-nav-bar&
The views will be rendered in the &ion-nav-view& directive below
Templates are in the /templates folder (but you could also
have templates inline in this html file if you'd like).
&ion-nav-view&&/ion-nav-view&
index.html中 head中就是配置一些适配参数和引用一些js,包括app.js,controllers.js,services.js 自己定义的3个js文件。
body中是绘制整个页面的,在body这个标签上加上了ng-app 标记,表示body这个标签之内的东西由angularJs来解析,angularJs承包了body这个鱼塘,并且起了一个名字:starter,这样就会告诉Angular 去管理页面上的所有DOM 元素。
body中就是一些ionic的界面组件了,每个组件的解释和用法可参考该网站:
在最后一行,有个ion-nav-view组件,该组件的作用为:在app启动时,$stateProvider就会检查url,检查它的索引匹配状态,然后尝试将对应的html加载到&ion-nav-view&内。
Create tabs with an icon and label, using the tabs-positive style.
Each tab's child &ion-nav-view& directive will have its own
navigation history that also transitions its views in and out.
&ion-tabs class="tabs-icon-top tabs-color-active-positive"&
&!-- Dashboard Tab --&
&ion-tab title="Status" icon-off="ion-ios-pulse" icon-on="ion-ios-pulse-strong" href="#/tab/dash"&
&ion-nav-view name="tab-dash"&&/ion-nav-view&
&/ion-tab&
&!-- Chats Tab --&
&ion-tab title="Chats" icon-off="ion-ios-chatboxes-outline" icon-on="ion-ios-chatboxes" href="#/tab/chats"&
&ion-nav-view name="tab-chats"&&/ion-nav-view&
&/ion-tab&
&!-- Account Tab --&
&ion-tab title="Account" icon-off="ion-ios-gear-outline" icon-on="ion-ios-gear" href="#/tab/account"&
&ion-nav-view name="tab-account"&&/ion-nav-view&
&/ion-tab&
&/ion-tabs&
该html即为整个布局页面,3个tab页:Status,Chats,Account
定义了3个tab,每个tab中有一个ion-nav-view ,还定义了tab 页选中和没选中时的图标,以及指定超链接目标的 URL
tab-dash.html
&ion-view view-title="Dashboard"&
&ion-content class="padding"&
&div class="list card"&
&div class="item item-divider"&Recent Updates&/div&
&div class="item item-body"&
There is a fire in &b&sector 3&/b&
&div class="list card"&
&div class="item item-divider"&Health&/div&
&div class="item item-body"&
You ate an apple today!
&div class="list card"&
&div class="item item-divider"&Upcoming&/div&
&div class="item item-body"&
You have &b&29&/b& meetings on your calendar tomorrow.
&/ion-content&
&/ion-view&
此html中是纯的静态代码,用到了较多的ionic组件,可参考上面的api了解每个组件的用法。
-----重点来了-----
tab-chats.html
&ion-view view-title="Chats"&
&ion-content&
&ion-list&
&ion-item class="item-remove-animate item-avatar item-icon-right" ng-repeat="chat in chats" type="item-text-wrap" href="#/tab/chats/{{chat.id}}"&
&img ng-src="{{chat.face}}"&
&h2&{{chat.name}}&/h2&
&p&{{chat.lastText}}&/p&
&i class="icon ion-chevron-right icon-accessory"&&/i&
&ion-option-button class="button-assertive" ng-click="remove(chat)"&
&/ion-option-button&
&/ion-item&
&/ion-list&
&/ion-content&
&/ion-view&
这是第2个tab页,是一个list列表。首先定义了页面的标题:Chats ,然后定义了一个列表,接着定义列表的item,其中有这么一句:ng-repeat="chat in chats"
, ng-repeat是angular的标签,表示遍历,后面的写法应该就是遍历chats了,那么问题来了:chats从哪来的呢?
带着疑问继续看代码
先看一下angularJs中的一个重要概念
$scope概念
$scope 的使用贯穿整个 Angular App 应用,它与数据模型相关联,同时也是表达式执行的上下文.有了 $scope 就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新 $scope,同样的 $scope 发生改变时也会立刻重新渲染视图。其实就是双向绑定。
有了 $scope 这样一个桥梁,应用的业务代码可以都在 controller 中,而数据都存放在controller 的 $scope 中。
$scope概念图
$scope 的作用
$scope 对象在 Angular 中充当数据模型的作用,也就是一般 MVC 框架中 Model 得角色.但又不完全与通常意义上的数据模型一样,因为 $scope 并不处理和操作数据,它只是建立了视图和 HTML 之间的桥梁,让视图和 Controller 之间可以友好的通讯。
再进一步系统的划分它的作用和功能:
提供了观察者可以监听数据模型的变化
可以将数据模型的变化通知给整个 App
可以进行嵌套,隔离业务功能和数据
给表达式提供上下文执行环境
在 Javascript 中创建一个新的执行上下文,实际就是用函数创建了一个新的本地上下文,在 Angular 中当为子 DOM 元素创建新的作用域时,其实就是为子 DOM 元素创建了一个新的执行上下文。
$scope 生命周期
Angular 中也有一个'事件'的概念,比如当一个绑定了 ng-model的 input 值发生变化时,或者一个 ng-click 的 button 被点击时,Angular 的事件循环就会启动.事件循环是 Angular 中非常非常核心的一个概念,因为不是本文主旨所以不多说,感兴趣的可以自己看看资料.这里事件就在 Angular 执行上下文中处理,$scope 就会对定义的表达式求值.此时事件循环被启动, Angular 会监控应用程序内所有对象,脏值检查循环也会启动。
$scope 的生命周期有4个阶段:
控制器或者指令(ng-controller)创建时, Angular 会使用 $injector 创建一个新的作用域,然后在控制器或指令运行时,将作用域传递进去。
Angular 启动后会将所有 $scope 对象附加或者说链接到视图上,所有创建 $scope 对象的函数也会被附加到视图上.这些作用域将会注册当 Angular 上下文发生变化时需要运行的函数.也就是 $watch 函数, Angular 通过这些函数或者何时开始事件循环。
一旦事件循环开始运行,就会开始执行自己的脏值检测.一旦检测到变化,就会触发 $scope 上指定的回调函数。
通常来讲如果一个 $scope 在视图中不再需要, Angular 会自己清理它.当然也可以通过 $destroy() 函数手动清理。
可以参考以下网站来进一步了解$scope
笔者总结一下:
一个controller对应了一个$scope对应了一个DOM,强调一下是DOM,不一定是body,也有可能是div,总之就是一个标签都可以配置一个ng-controller。而这个DOM范围内,都可以引用$scope中存储的数据或者函数
接着上面的问题:chats从哪来的呢?
从来的解释中可以看出,这个chats定是存储在tab-chats.html对应的某个$scope中,由于tab-chats.html中没有直接的DOM指出一个具体的controller,否者我们就直接去controller中找$scope就行了。
但是我们在app.js文件中发现一些端倪:
app.js源代码
// Ionic Starter App
// angular.module is a global place for creating, registering and retrieving Angular modules
// 'starter' is the name of this angular module example (also set in a &body& attribute in index.html)
// the 2nd parameter is an array of 'requires'
// 'starter.services' is found in services.js
// 'starter.controllers' is found in controllers.js
angular.module('starter', ['ionic', 'starter.controllers', 'starter.services'])
.run(function ($ionicPlatform) {
$ionicPlatform.ready(function () {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
cordova.plugins.Keyboard.disableScroll(true);
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleLightContent();
.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {
$ionicConfigProvider.platform.ios.tabs.style('standard');
$ionicConfigProvider.platform.ios.tabs.position('bottom');
$ionicConfigProvider.platform.android.tabs.style('standard');
$ionicConfigProvider.platform.android.tabs.position('bottom');
$ionicConfigProvider.platform.ios.navBar.alignTitle('center');
$ionicConfigProvider.platform.android.navBar.alignTitle('left');
$ionicConfigProvider.platform.ios.backButton.previousTitleText('').icon('ion-ios-arrow-thin-left');
$ionicConfigProvider.platform.android.backButton.previousTitleText('').icon('ion-android-arrow-back');
$ionicConfigProvider.platform.ios.views.transition('ios');
$ionicConfigProvider.platform.android.views.transition('android');
.config(function ($stateProvider, $urlRouterProvider) {
// Ionic uses AngularUI Router which uses the concept of states
// Learn more here: /angular-ui/ui-router
// Set up the various states which the app can be in.
// Each state's controller can be found in controllers.js
$stateProvider
// setup an abstract state for the tabs directive
.state('tab', {
url: '/tab',
// abstract: true 表明此状态不能被显性激活,只能被子状态隐性激活
abstract: true,
templateUrl: 'templates/tabs.html'
// Each tab has its own nav history stack:
.state('tab.dash', {
url: '/dash',
'tab-dash': {
templateUrl: 'templates/tab-dash.html',
controller: 'DashCtrl'
.state('tab.chats', {
url: '/chats',
'tab-chats': {
templateUrl: 'templates/tab-chats.html',
controller: 'ChatsCtrl'
.state('tab.chat-detail', {
url: '/chats/:chatId',
'tab-chats': {
templateUrl: 'templates/chat-detail.html',
controller: 'ChatDetailCtrl'
.state('tab.account', {
url: '/account',
'tab-account': {
templateUrl: 'templates/tab-account.html',
controller: 'AccountCtrl'
// if none of the above states are matched, use this as the fallback
$urlRouterProvider.otherwise('/tab/dash');
直接看到以下代码:
.state('tab.chats', {
url: '/chats',
'tab-chats': {
templateUrl: 'templates/tab-chats.html',
controller: 'ChatsCtrl'
tab-chats.html页面对应的controller为ChatsCtrl,这时候我们就可以去controllers.js中找到名字为ChatsCtrl的controller了。
controllers.js
angular.module('starter.controllers', [])
.controller('DashCtrl', function($scope) {})
.controller('ChatsCtrl', function($scope, Chats) {
$scope.chats = Chats.all();
$scope.remove = function(chat) {
Chats.remove(chat);
.controller('ChatDetailCtrl', function($scope, $stateParams, Chats) {
$scope.chat = Chats.get($stateParams.chatId);
.controller('AccountCtrl', function($scope) {
$scope.settings = {
enableFriends: true
看到 $scope.chats = Chats.all();
给chats赋值了,此处的chats即为前面提到问题的答案,tab-chats.html页面的chats的来源即为此处,并且已经赋值了。
那么问题又来了,它(chats )的值是什么呢?
从上面的代码可以看出它的值为:Chats.all()
但是Chats是什么呢?
其实Chats和$scope一样都是服务,只不过$scope是系统服务(就是有系统来定义的),而Chats是自定义服务,需要自己写代码定义。
我们在services.js中可以找到Chats服务。
services.js代码
angular.module('starter.services', [])
.factory('Chats', function() {
var chats = [{
name: 'Ben Sparrow',
lastText: 'You on your way?',
face: '/profile_images/SgAuHeY.png'
name: 'Max Lynx',
lastText: 'Hey, it\'s me',
face: '/u/11214?v=3&s=460'
name: 'Adam Bradleyson',
lastText: 'I should buy a boat',
face: '/profile_images/TKj_qa.jpeg'
name: 'Perry Governor',
lastText: 'Look at my mukluks!',
face: '/profile_images/j5HUXMY.png'
name: 'Mike Harrington',
lastText: 'This is wicked good ice cream.',
face: '/profile_images/ae1n61.png'
all: function() {
remove: function(chat) {
chats.splice(chats.indexOf(chat), 1);
get: function(chatId) {
for (var i = 0; i & chats. i++) {
if (chats[i].id === parseInt(chatId)) {
return chats[i];
上面的factory('Chats', function() 中的
Chats 自定义的服务名称 ,该服务定义了返回值,返回了3个函数:all() ,
remove() ,get()
所以上面的Chats.all()的值是什么也就很清楚了,即是var chats 这个对象数组。
关于如何自定义服务,可参考这个网站
从上面的网站中,了解到这一点:
在Angular里面,services作为单例对象在需要到的时候被创建,只有在应用生命周期结束的时候(关闭浏览器)才会被清除。而controllers在不需要的时候就会被销毁了。
说的是服务的生命周期,很重要的一点。
基本上分析了demo中的大部分,不想写了,下一次再写,分析一下app.js中的一些东西。
文章中用到项目地址 :
参考链接:
看红尘冉冉,须臾无间,参遍昙华演幻。问法珠玄玄,方寸有变,听尽默剑说禅(window.slotbydup=window.slotbydup || []).push({
id: '2014386',
container: s,
size: '234,60',
display: 'inlay-fix'
&&|&&0次下载&&|&&总18页&&|
您的计算机尚未安装Flash,点击安装&
阅读已结束,如需下载到电脑,请使用积分()
下载:8积分
0人评价18页
0人评价7页
0人评价6页
0人评价5页
0人评价7页
所需积分:(友情提示:大部分文档均可免费预览!下载之前请务必先预览阅读,以免误下载造成积分浪费!)
(多个标签用逗号分隔)
文不对题,内容与标题介绍不符
广告内容或内容过于简单
文档乱码或无法正常显示
若此文档涉嫌侵害了您的权利,请参照说明。
我要评价:
下载:8积分只需掌握Web技术就能开发移动应用是不是很爽?Ionic就可以做到!Ionic是近几年很火的一项跨平台开发技术,有了它之后,用我们熟知的HTML、CSS和JavaScript技术就可以同时开发iOS和Android应用。让我们来初步了解下Ionic吧!
1Ionic是什么Ionic 通过整合各种技术和功能使构建Hybrid 应用更加快速、容易和美观。Ionic 的生态系统基于Angular 和Cordova前者是Web 应用框架后者是构建和打包原生应用的工具。
下图展示了整个技术栈的概况
技术栈的起点是用户在设备上打开应用。假设是一台运行iOS 的iPhone 或者一台运行Android 的Nexus 10。下面是各个部分的介绍。
设备—设备可以加载应用。设备中的操作系统负责安装从平台对应商店下载的应用。操作系统还会提供一系列应用可以使用的功能API比如GPS 位置、通讯录列表和照相机。
Cordova 应用包装器—这是一个能够加载Web 应用代码的原生应用。Cordova 是一个平台用于构建能够执行HTML、CSS 和JavaScript 的原生应用这种应用被称为Hybrid 移动应用。它是平台和应用之间的桥梁可以创建一个能够安装的原生应用上图 中被称作应用封装器。这个原生应用中包含WebView实际上是一个独立的浏览器窗口可以通过JavaScriptAPI 来运行Web 应用。
Cordova JavaScript API—这是沟通应用和设备的桥梁应用封装器可以通过JavaScript API 来联通Web 应用和原生平台。具体的实现细节不用在意总之最后Cordova 会帮你生成原生应用。
Angular—用来控制应用路由和功能的Web 应用。Angular Web 应用运行在WebView 中。Angular 是一个流行的Web 应用构建框架主要管理Web 应用的逻辑和数据。
Ionic—控制应用中用户界面组件的渲染。Ionic 基于Angular 构建主要用来设计用户界面和用户体验。Ionic 包含一些视觉元素比如选项卡、按钮、导航头部。这些界面控件是Ionic 的核心可以在Hybrid 应用中提供接近原生界面的体验。Ionic 还提供了许多功能和特性可以帮助你完成创建- 预览-发布整个流程。
Ionic 将上述这些技术整合起来成为一个非常强大的移动端应用开发平台。现在你对Ionic 及其相关技术有了初步了解下面我们来对比一下三种主流的移动应用同时介绍Ionic 的优势。
2移动开发类型为移动设备开发应用有好几种方法有必要知道每种方法的优点和缺点。一共有三种基础类型原生应用、移动端网站和Hybrid 应用我们会详细介绍它们的区别。
在下图中你可以看到三种类型在设计和架构上的对比。图中还展示了应用如何通过访问数据库或者Web 服务API 来加载数据。
2.1 原生移动应用要创建原生应用开发者需要使用移动平台默认的语言对iOS 来说是Objective-C或者Swift对Android 来说是Java。写完之后需要编译应用并把它安装到设备上。开发者可以使用平台的软件开发套件SDK来和平台API 通信从而可以访问设备中的数据或者使用HTTP 请求从外部服务器加载数据。
iOS 和Android 都提供了一系列预先定义好的API可帮助开发者在可控的范围内使用平台特性。有许多官方或者非官方出品的工具可以辅助开发原生应用。对开发者来说在原生应用中使用框架来简化开发是很常见的。
原生应用的好处
比起Hybrid 应用和移动端网站原生应用有很多好处主要得益于和设备平台紧密结合
原生API—原生应用可以在应用中直接使用原生API这和平台的交流最紧密。
性能—原生应用性能最好。
环境相同—原生应用使用原生API 写成对于其他原生开发者来说很容易理解。
但是原生应用也有很多缺点。
原生应用的缺点
原生应用的缺点主要是开发和维护难度大。
语言要求—原生应用要求开发者掌握平台对应的语言比如Java并且知道如何使用平台提供的API。
不支持跨平台—每个平台都要单独开发。
费时费力—通常来说需要做很多构建工作增加成本。
如果老板要求你不得不使用Java 和Objective-C 或者团队有大量资源并且真的需要原生应用带来的好处那最好的选择就是原生应用。除此之外你最好考虑其他类型的应用。
2.2移动端网站Web 应用移动端网站或者说Web 应用很适合移动设备使用可以在手机浏览器中访问。Web 应用就是在手机浏览器中访问的网站它们专门被设计成适合手机屏幕尺寸。
有些网站的设计者会专门为移动设备开发一个版本。你在移动设备上访问网站的时候可能会被重定向到另一个功能有限的版本。比如访问eBay你会被重定向到 子域名。而访问其他一些网站比如 时你会发现网站的设计会根据设备的类型和屏幕尺寸进行调整。这用到了被称为响应式设计的技术。网站的内容会根据浏览器窗口尺寸自动调整大小有些内容甚至会被隐藏起来。
移动端网站的优点
移动端网站有很多优点主要体现在效率和设备兼容性上。
可维护性—移动端网站很容易更新和维护没有任何审核流程也不需要更新设备上的程序。
免安装—网站在互联网中不需要安装到移动设备中。
跨平台—所有移动设备都有浏览器它们都可以访问你的应用。
和原生应用相比移动端网站也有很多缺点。
移动端网站的缺点
移动端网站运行在手机浏览器中因此有很多限制和缺点。
不具备原生访问能力—因为移动端网站运行在浏览器中它们不能访问原生API 和平台只能访问浏览器提供的API。
需要使用键盘—用户必须在浏览器中输入地址来寻找或者使用移动端网站这比单击一个图标困难多了。
受限的用户界面—很难创建对触摸友好的应用尤其是当要同时兼容桌面版时。
移动端访问量下降—用户在移动设备上访问网站的时间不断减少使用应用的时间越来越多。
不同的产品和服务需求不同即使你已经有了移动端应用可能还是需要一个移动端网站。不过总体来说移动端网站的重要性不断下降研究表明用户使用应用的时间更多。
2.3 Hybrid 应用Hybrid 应用指的是包含独立浏览器实例的移动应用这个实例通常被称作Web-View可以在原生应用中运行Web 应用。Hybrid 应用会使用原生应用封装器来实现WebView 和原生设备平台的通信。这意味着Web 应用可以运行在移动设备上并且可以访问设备的功能比如照相机和GPS。
有很多工具可以实现WebView 和原生平台之间的通信从而让Hybrid 应用成为可能。发布这些工具的并不是iOS 或者Android 官方平台而是第三方比如Apache Cordova。编译Hybrid 应用时你的Web 应用会被转换成一个原生应用。
Hybrid 应用的优点
相比移动端网站和原生应用Hybrid 应用有一些优点这也是它成为有力竞争者的原因。
跨平台—可以只开发一次部署到多个平台最小化开发成本。
和Web 开发共用技术—可以使用开发网站和Web 应用的技术来开发移动应用。
设备访问能力—因为WebView 被封装在原生应用中你的应用让你可以像原生应用一样访问所有的设备功能。
简化开发—开发流程简单快捷不需要为了预览重复构建。也可以继续使用构建网站的那一套开发工具。
Hybrid 应用允许使用Web 平台的技术开发移动应用你可以像开发网站一样开发应用的绝大部分功能。当需要使用原生API 时Hybrid 应用框架会把API 桥接到JavaScript 中。你的应用可以像检测单击和键盘事件一样检测扫动和捏合手势。不过如你所料Hybrid 应用也有一些缺点。
Hybrid 应用的缺点
因为身处WebView 中受到原生集成的限制Hybrid 应用有如下一些缺点。
WebView 限制—应用只能运行在WebView 实例中这意味着应用的性能取决于浏览器。
通过插件访问原生功能—你需要的原生API 现在可能还没有插件实现可能需要一些额外的开发工作来进行桥接。
没有原生用户界面控件—如果没有Ionic 这样的工具开发者需要创建所有的用户界面元素。
有了Ionic你可以使用Web 开发者已经熟悉的知识和技能来构建Hybrid 应用。
相 关 图 书
《Ionic实战基于AngularJS的
移动混合应用开发》
集成Cordova|Angular的热门技术
快速实现iOS|Android跨平台应用
【美】Jeremy Wilken 著
2016年7月出版
Ionic最大的亮点是集成了Angular和Cordova对于有开发经验的前端工程师来说上手难度大大降低并且能直接使用现有的大量第三方库和框架。这是一本详尽的Ionic实战教程不仅告诉你“怎么做”还告诉你“为什么”这正是大部分入门书籍所欠缺的。
用云栖社区APP,舒服~
【云栖快讯】支撑千亿营收,阿里如何做研发?淘宝如何做敏捷实践?如何面对开发中的“黑天鹅”事件?6月29日首届阿里研发效能嘉年华,独家直播,赶紧预约吧!&&
基于云安全大数据能力实现,通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源...
大数据开发套件(Data IDE),提供可视化开发界面、离线任务调度运维、快速数据集成、多人协同工作等功能,为您...
充分利用阿里云现有资源管理和服务体系,引入中间件成熟的整套分布式计算框架,以应用为中心,帮助企业级客户轻松构建并...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...

我要回帖

更多关于 ionic开发工具 的文章

 

随机推荐