Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mobile first! Wijmo 5 + Ionic Framework之:费用跟踪 App

Mobile first! Wijmo 5 + Ionic Framework之:费用跟踪 App

作者头像
葡萄城控件
发布于 2018-01-10 09:57:16
发布于 2018-01-10 09:57:16
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

费用跟踪应用采用了Wijmo5Ionic Framework创建,目的是构建一个hybird app。

我们基于《Mobile first! Wijmo 5 + Ionic Framework之:Hello World!》的环境,将在本教程中完成费用跟踪App的构建。下面的代码结构是本教程完成要达到的效果,请预先创建好文件和目录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
www/                     --> 工程根目录
  index.html         --> app 布局文件 (HTML文件)
  css/                   --> css 目录
  js/                    --> javascript 目录
    app.js               --> 主模块
    app.routes.js        --> 主路由模块
    controllers/         --> app控制器目录
    models/                 --> app模块目录
    services/        --> app 数据Service目录
  templates/             --> angularJs视图代码目录(通过UI-Router调用) 
  lib/           --> 第三方类库, 包括Ionic, Wijmo, jQuery等

数据模型(Data Model)

在费用跟踪App中,我们先要创建Data Model,E-R图如下

  • Category:开支分类
  • Expense:开支记录
  • Budget: 预算(下面会用到)

在代码中,我们需要在www/js/services构建AngularJs Services来对数据模型进行建模。我们会用到HTML5的localStorage进行数据本地存储, 采用的格式为JSON。 需要注意的是,HTML5本地存储只能存字符串,任何格式存储的时候都会被自动转为字符串,所以读取的时候,需要自己进行类型的转换。目前我们实现的是HTML5 本地存储,有兴趣的读者还可移植为RESTful APISQLite数据存储方法。

运行demo后,通过Chrome调试查看的本地存储截图:

浏览开支历史记录

在开支历史页面中,提供了2个功能:浏览开支历史记录、删除开支记录。为了实现这些功能,在www\js\controllers\history.js文件中,添加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//从localStorage获得开支数据
$scope.expenses = ExpenseSvc.getExpensesWithCategory();

这行代码提供了返回本地存储的开支记录。ExpenseSvc 服务,不仅返回了开支对象,同时也返回了开支分类。基于这些数据,在

www\templates\history.tpl.htm文件中,在ion-context指令内添加Ionic的ion-list指令,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ion-view title="History">
  <ion-nav-buttons side="right">
    <a class="button button-icon icon ion-plus" href="#/app/create"></a>
  </ion-nav-buttons>
  <ion-content class="has-header">
    <ion-list>
      <ion-item ng-repeat="expense in expenses | orderBy:'date':reverse track by expense.id" class="item item-icon-left">
        <i class="icon ion-record {{ expense.category.cssClass }}"></i>
        <div class="row">
          <div class="col-50">
            <h2>{{ expense.title }}</h2>
          </div>
          <div class="col-25">
            <small class="light-grey">{{ expense.date | date: 'shortDate' }}</small>
          </div>
          <div class="col-25">
            {{ expense.amount | currency }}
          </div>
        </div>
      </ion-item>
    </ion-list>
  </ion-content>
</ion-view>

ion-list指令,用于生成排序的HTML列表,其子标签ion-item指令用于生成HTML列表项。 在ngRepeat指令中,我们使用了“track by”,目的是在对开支集合修改时提升性能,相关教程可参考博客《Using Track-By With ngRepeat In AngularJS 1.2 》。

现在添加删除开支记录按钮,用于向左滑动出现删除按钮、点击删除可删除开支记录。

在ion-item标签关闭前添加ion-option-button标签,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ion-option-button class="button button-assertive" on-tap="confirmDelete(expense.id)">Delete</ion-option-button>

ion-option-button 是Ionic提供的另一个指令,用于在ion-item指令内试用。默认的,ion-option-button 是隐藏的,当在ion-item内向左滑动,则按钮会可见。这个功能尤其对小屏幕设备非常重要。另外,还可通过该指令内置的can-swipe来实现对这个权限的管理--如有的用户不允许删除操作权限。

在删除函数中(控制器),可看到代码片段如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function confirmDelete(expenseId) {
   // delete expense by its id property
   $scope.expenses = ExpenseSvc.deleteExpense(expenseId);
}

通过这个代码,我们调用ExpenseSvc服务的deleteExpense进行删除指定的开支记录(expenseId),同时这个方法也会返回开支记录集合用于更新页面数据。在真实的场景中,删除记录返回整个集合不是最理想的,但在此处我们用于演示说明。可动手试着删除几行数据试试。

另外,在删除这种比较危险的操作中,应该需要添加对话框再次提醒一下用户。这里我们使用了Ionic提供的$ionicActionSheet service服务来实现。更新www\js\controllers\history.js控制器代码的confirmDelete函数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//删除开支记录
$scope.confirmDelete = function (expenseId) {
  //ionic的 确认对话框
  // show()函数返回了一个函数,用于隐藏actionSheet
  var hideSheet = $ionicActionSheet.show({
    titleText: 'Are you sure that you\'d like to delete this expense?',
    cancelText: 'Cancel',
    destructiveText: 'Delete',
    cancel: function () {
      // 如果用户选择cancel, 则会隐藏删除按钮
      $ionicListDelegate.closeOptionButtons();
    },
    destructiveButtonClicked: function () {
      // 通过id删除开支记录
      $scope.expenses = ExpenseSvc.deleteExpense(expenseId);

      // 隐藏对话框
      hideSheet();
    }
  });
};

ionicActionSheet服务提供了自定义接口,可实现各种提示对话框。上面代码实现的提示对话框效果截图如下:

创建开支记录

点击History页面右上角的

可实现手工创建一条新的开支记录。在www\templates\createExpense.tpl.htm文件中,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ion-view title="Create">
    <ion-content class="has-header padding">
        <form name="frmCreate">
            <div class="custom-form-list list">
                <label class="item item-input">
                    <i class="icon ion-alert-circled placeholder-icon assertive" ng-show="!frmCreate.title.$pristine && frmCreate.title.$invalid"></i>
                    <input name="title" type="text" placeholder="Title" ng-model="expense.title" ng-maxlength="55" required>
                </label>
                <wj-input-number value="expense.amount" min="0" step="5" format="c2"></wj-input-number>
                <wj-calendar value="expense.date"></wj-calendar>                
                <wj-combo-box items-source="categories" 
                              display-member-path="htmlContent"
                              selected-value-path="id"
                              selected-value="expense.categoryId" 
                              is-editable="false" 
                              is-content-html="true"></wj-combo-box>
                <label class="item item-input">
                    <textarea placeholder="Description" ng-model="expense.description"></textarea>
                </label>
            </div>
            <div class="button-bar">
                <button type="button" class="button button-dark icon-left ion-close" on-tap="cancel()">Cancel</button>
                <button type="button" class="button button-balanced icon-left ion-checkmark" on-tap="addExpense()" ng-disabled="frmCreate.title.$invalid">Save</button>
            </div>
        </form>
    </ion-content>
</ion-view>

这里使用ion-view 和 ion-content 指令进行内容展现。然后再添加Form,用ng-show指令验证输入内容---Wijmo的指令已经在输入门限做了限制,故不需要验证。同时Wijmo Calendar 和InputNumber应该是自解释,ComboBox中可能不是。

ComboBox关联数据模型中的开支分类,我们通过其itemsSource属性进行数据绑定。ComboBox的displayMemberPath 用于设置显示内容,selectedItem的selectedValue用于选择开支分类的id属性。

在createExpense 控制器中,可看到如下的代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 初始化Expense object
$scope.expense = new Expense('', 0, new Date(), '', null);

// 获得HTML类型的开支分类
$scope.categories = CategorySvc.getCategoriesWithHtmlContent();

// 用localStorage存储开支数据
$scope.addExpense = function () {
  // insert expense
  ExpenseSvc.insertExpense($scope.expense);
  $scope.cancel();
};

// 取消方法 (如,可回到主页面)
$scope.cancel = function () {
  $state.go('app.overview');

};

上面的第一行代码用于初始化一个开支记录,用Expense的构造函数来实现,并赋值给$scope.expense对象。 开支分类,通过调用CategorySvc服务的接口,从localStorage获得数组。addExpense 方法用于提交新增的开支记录,同样用到了ExpenseSvc服务。最后一个函数$scope.canel使用了UI Router的 $state 服务,导航到主页面。

运行app,截图如下:

Details Grid

在前面几节中,我们分别学习了如何查看、创建、删除开支记录。在本节,我们将通过Wijmo5的FlexGrid和CollectionView批量对开支记录进行呈现,打开detailsGrid 模板文件,添加如下代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ion-view title="Details Grid">
  <!-- set overflow-scroll="true" and hand scrolling to native -->
  <ion-content class="has-header" overflow-scroll="true">
    <wj-flex-grid auto-generate-columns="false" items-source="data" selection-mode="Row" row-edit-ending="rowEditEnding(s,e)" style="position:relative">
      <wj-flex-grid-column width="2*" min-width="250" header="Title" binding="title"></wj-flex-grid-column>
      <wj-flex-grid-column width="*" min-width="100" header="Amount" binding="amount" format="c2"></wj-flex-grid-column>
      <wj-flex-grid-column width="*" min-width="100" header="Date" binding="date"></wj-flex-grid-column>
      <wj-flex-grid-column width="2*" min-width="250" header="Description" binding="description"></wj-flex-grid-column>
    </wj-flex-grid>
  </ion-content>
  <ion-footer-bar class="bar button-bar-footer">
    <div class="button-bar">
      <button type="button" class="button button-dark icon-left ion-close" on-tap="cancel()">Cancel</button>
      <button type="button" class="button button-balanced icon-left ion-checkmark" ng-disabled="!data.itemsEdited.length" on-tap="update()">Save</button>
    </div>
  </ion-footer-bar>
</ion-view>

在FlexGrid指令下面,我们添加了2个按钮,Cancel和Save,分别用于当点击的时候进行取消和存储操作,数据存储于localStorage。其中,Save按钮的默认不可用,通过ngDisabled的表达式进行控制。

FlexGrid 指令,用于在模板内生成Wijmo5的FlexGrid 控件。我们使用itemsSource 进行数据源绑定,同时通过autoGenerateColumns=”false”关闭自动生成数据列,以及SelectMode类型为整行Row。同时也设置了FlexGrid的rowEditEnding事件,用于验证数据输入。在FlexGrid内部,定义了Columns,分别指定了header、binding、width。

如下代码是detailsGrid 控制器片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过localStorage获得开支记录数据,并初始化CollectionView
$scope.data = new wijmo.collections.CollectionView(ExpenseSvc.getExpenses());

// CollectionView的变更可跟踪
$scope.data.trackChanges = true;

// 批量更新开支记录
$scope.update = function () {
  // make sure items have been edited
  if ($scope.data.itemsEdited.length) {
    // bulk update expenses
    ExpenseSvc.updateExpenses($scope.data.itemsEdited);

    // return to overview page
    $scope.cancel();
  }
};

// 取消方法 (如导航到主页面)
$scope.cancel = function () {
  $state.go('app.overview');
};

// FlexGrid.rowEditEnding事件处理
$scope.rowEditEnding = function (sender, args) {
  var expense = $scope.data.currentEditItem,      // get expense being edited
      isValid = isExpenseValid(expense);          // validate expense

  // if the expense isn't valid, cancel the edit operation
  if (!isValid) {
    $scope.data.cancelEdit();
    return;
  }
};

// 验证函数:确保开支记录数据合法有效
function isExpenseValid(expense) {
  return expense &&
         expense.title !== '' &&
         expense.title.length < 55 &&
         wijmo.isNumber(expense.amount) &&
         wijmo.isDate(expense.date) &&
         expense.amount >= 0;
}

上面代码的第一行,通过从localStorage 加载数据,然后初始化CollectionView的对象,继而赋值给$scope.data对象,用于给前端HTML进行Data-Source绑定数据源。

接下来看cancel、update方法,cancel方法和上面的一样,使用了UI Router的$state服务进行回到首页。update方法,先进行数据判断,通过核查$scope.data.itemsEdited.length是否有效(是否有开支记录变更),然后再调用ExpenseSvc 进行数据修改,对localStorage数据进行存储处理。

最后,FlexGrid的rowEditEnding事件触发了rowEditEnding函数,即当row修改完成后尚未cancel、update前触发。在这里进行有效性判断,若无效则cancel并返回。这里,我们使用了Wijmo 5提供的工具函数:isNumber和isDate来进行判断。

运行Details Grid截图如下:

概述

修改app.routes.js 文件,从默认的history页面到overview页面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$urlRouterProvider.otherwise('/app/history');

to:

$urlRouterProvider.otherwise('/app/overview');

这个细小的改变使得UI Router 会对没有明确重定向的,均会导向overview页面。

overview页面代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ion-view title="Overview">
  <ion-nav-buttons side="right">
    <a class="button button-icon icon ion-plus" href="#/app/create"></a>
  </ion-nav-buttons>
  <ion-content class="has-header padding">
    <div ng-show="hasExpenses">
      <hgroup class="text-center padding-vertical">
        <h2 class="title">
          <span ng-class="expensesCssClass">{{ totalExpenses | currency }}</span> of {{ budget | currency }}
        </h2>
        <h4>{{ budgetMsg }}</h4>
      </hgroup>
      <wj-flex-chart items-source="categories"
                     chart-type="Bar" binding-x="name"
                     tooltip-content=""
                     selection-mode="Point"
                     footer="Tap the chart's bars to see history by category"
                     selection-changed="selectionChanged(s)"
                     item-formatter="itemFormatter"
                     style="height: 400px;">
        <wj-flex-chart-series binding="total"></wj-flex-chart-series>
        <wj-flex-chart-axis wj-property="axisX" format="c0"></wj-flex-chart-axis>
        <wj-flex-chart-axis wj-property="axisY" reversed="true" major-grid="false" axis-line="true"></wj-flex-chart-axis>
      </wj-flex-chart>
    </div>
    <div ng-hide="hasExpenses">
      <h4 class="padding text-center">You haven't added any expenses yet!  Click the <i class="icon ion-plus"></i> button to get started!</h4>
    </div>
  </ion-content>
</ion-view>

上面的代码,首先使用hgroup元素呈现了开支记录的总和。下面接着使用了Wijmo 5 FlexChart 渲染了每个开支分类的开支金额,在FlexChart 指令内,我们指定了一些属性,如数据序列、x、y轴,同时当点击Bar的时候会触发FlexChart的plot elements 事件,对当前分类详情做列表呈现。

上面这些功能的实现,基于overview.js文件的逻辑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过BudgetSvc服务,获得localStorage数据
$scope.budget = BudgetSvc.getBudget();

// 判断是否有开支记录,返回bool
$scope.hasExpenses = ExpenseSvc.hasExpenses();

// 获得开支的总金额
$scope.totalExpenses = ExpenseSvc.getExpenseTotal();

// 获得各个分类的小计金额
$scope.categories = ExpenseSvc.getCategoriesExpenseSummary();

// 初始化CSS 样式
$scope.expensesCssClass = 'energized';

//设置开支金额显示字符串
// NOTE: use $filter service to format the total prior to concatenating the string
$scope.budgetMsg = $scope.totalExpenses <= $scope.budget
                        ? $filter('currency')($scope.budget - $scope.totalExpenses).concat(' until you reach your monthly limit')
                        : $filter('currency')($scope.totalExpenses - $scope.budget).concat(' over your monthly limit');

//设置开支css样式
$scope.expensesCssClass = 0 === $scope.totalExpenses
                ? 'dark'
                : $scope.totalExpenses === $scope.budget
                     ? 'energized'
                     : $scope.totalExpenses > $scope.budget
                          ? 'assertive'
                      : 'balanced';

//*** FlexChart's selectionChanged event handler
$scope.selectionChanged = function (sender) {
  var category = null;
  if (sender.selection && sender.selection.collectionView.currentItem) {
      // get the currently selected category
      category = sender.selection.collectionView.currentItem;

      // navigate to the category history page to display expenses for selected category
      $state.go('app.category-history', { category: category.slug });
  }
};

//*** set color of FlexChart's plot elements
$scope.itemFormatter = function (engine, hitTestInfo, defaultFormat) {
  if (hitTestInfo.chartElement === wijmo.chart.ChartElement.SeriesSymbol) {
      // set the SVG fill and stroke based on the category's bgColor property
      engine.fill = hitTestInfo.item.bgColor;
      engine.stroke = hitTestInfo.item.bgColor;
      defaultFormat();
  }

};

预览截图如下:

下载地址

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-10-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mobile first! Wijmo 5 + Ionic Framework之:Hello World!
本教程中,我们用Wijmo 5 和 Ionic Framework实现一个Mobile的工程:Hello World。 Ionic是什么? Ionic是一个HTML5框架、免费、开源,用于帮助生成hybird mobile Apps (混合移动应用)。 Ionic包含3部分: CSS 样式:用于渲染Web页面,使得页面更接近原生移动应用 (Native App)。 AngularJS:Ionic使用AngularJs的扩展指令作为核心框架库,同时AngularJs也加快了开发过程。 Apache Cordo
葡萄城控件
2018/01/10
2.3K0
Mobile first! Wijmo 5 + Ionic Framework之:Hello World!
Ionic2 Rest 认证1、创建Ionic 2 APP2、创建服务3、创建登陆和注册页面4、登出和token检查
今天,我们使用REST API实现用户名密码认证,服务端端点如下: Endpoint 请求 响应 /login { username: '',password: '' } auth_token /logout add a token to headers /register { username: '', password: '' } 1、创建Ionic 2 APP 反复练习,应该是很熟悉了: ionic start Ionic2RestAuth --v2 我习惯上会先启动看看,确保项目创建成功: c
孙亖
2018/06/07
3.9K0
Ionic 2 :如何实现列表滑动删除按钮1.创建Ionic2应用2.准备列表数据3.修改主页(HOME)的模版4.创建方法删除数据5.添加一个编辑按钮总结
使用Ionic这种框架伟大的地方在于用户界面元素默认准备好了,意味着你可以设计更好的app而不需要很强的用户体检设计背景,而且让你可以更容易实现这些模式。 这篇教程将展示如何使用Ionic2添加一个简
孙亖
2018/06/07
4.1K0
实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI
系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求 实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目 实战使用Axure设计App,使用WebStorm开发(3) – 构建页面架构 实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI 实战使用Axure设计App,使用WebStorm开发(5) – 实现页面功能 实战使用Axure设计App,使用WebStorm开发(6) – 迈向后端  
葡萄城控件
2018/01/10
1.1K0
实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI
Ionic如何实现单选二级菜单切换
Ionic如何实现单选二级菜单切换 最近有个需求,需要做一个用户视图,数据全都从PC端系统实时取,由于这个功能在电脑浏览器展示还可以,即使菜单全部展开,只要美工稍加调整下位置也是放得下的,但是同样的功能让App也做一个就有问题了,尤其是课程体系切换里面有很多岗位菜单切换,而且是实时获取,如果在主页面显示会占用很大地方,影响用户体验,最终斟酌再三,将此菜单切换放在弹窗里面,就是点击一下弹个页面让用户选择,App页面宽度比较窄显示列表比较轻松,就做了个弹窗,需要说明的是这个弹窗点击一级菜单展开当前一级下面的
上帝
2018/05/18
1.8K0
【Appetite】ionic3实录(六)首页实现
观察之,发布者和内容的文本信息可以用ionic现有的组件实现,而视频播放和图片画廊(如果是轮播图可以用slides组件,它是阉割并封装过的swiper,好像现在这样的效果不能实现)需要使用第三方组件。步骤如下:
IT晴天
2018/08/20
1.2K0
使用Ionic2开发Todo应用0 开始之前1 创建新的Ionic 2工程2. 设置主页(Home page)3 持久化数据保存4 总结
本文使用Ionic2从头建立一个简单的Todo应用,让用户可以做以下事情: 查看todo列表 添加新的todo项 查看todo详情 保存 todo到持久化存储 0 开始之前 本教程需要你了解基本的Ionic 2概念。已经在电脑上安装了Ionic 2。如果没有,先去安装和学习吧。 1 创建新的Ionic 2工程 我们将通过生成一个基于“空白”模板的新项目开始。这是一个空的项目框架,但有一些示例代码供我们使用。 运行以下命令创建新项目 ionic start ionic-todo blank --v2 一
孙亖
2018/06/06
6.4K0
用WijmoJS搭建您的前端Web应用 —— React
在本系列文章中,我们已经介绍了Angular和Vue框架下 WijmoJS 的玩法。
葡萄城控件
2018/07/24
2K0
用WijmoJS搭建您的前端Web应用 —— React
Ionic 2 应用剖析0 开始之前1 创建一个新的Ionic 2 应用2 目录结构3. Class 定义Root Components 模版App Module总结
0 开始之前 通过本教程之前,您应该至少了解一些基本的Ionic 2概念。您还必须已经安装了Ionic 2 在您的机器上。 1 创建一个新的Ionic 2 应用 我们将使用有Ionic团队创建的tutorial模板,可见于官方教程,来创建我们的应用程序。要做到这一点,您需要运行以下命令: ionic start ionic2-tutorial tutorial --v2 现在您的应用程序将自己开始建立。为运行后续的命令,你应当将项目目录作为当前工作目录: cd ionic2-tutorial 简单瞟一眼应用
孙亖
2018/06/06
4.7K0
Ionic 2 项目结构./src/index.html./src/./src/app/app.html
解剖Ionic 2 app。进入项目创建的文件夹,这里有一个典型的Cordova项目结构,我们可以安装原生插件,创建平台定义工程文件。 ./src/index.html src/index.html是app的主入口, 设置脚本和CSS,引导、启动我们的应用。对于app的应用,Ionic在HTML中寻找<ion-app>标签。 <ion-app></ion-app> 下面的代码接近底部: <script src="cordova.js"></script> <script src="build/main.js
孙亖
2018/06/06
2.9K0
图解AngularJS Wijmo5和LightSwitch
Visual Studio 2013 中的 LightSwitch 有新增功能,包括更好的团队开发支持以及在构建 HTML 客户端桌面和 Office 365 应用程序方面的改进。本文结合最新发布的W
葡萄城控件
2018/01/10
1.4K0
图解AngularJS Wijmo5和LightSwitch
Ionic3学习笔记(十一)实现省市区三级联动
省市区json文件下载地址: https://raw.githubusercontent.com/raychenfj/ion-multi-picker/master/example/src/assets/chinese-cities.json
Theo Tsao
2018/09/07
1.9K0
构建具有用户身份认证的 Ionic 应用
序言:本文主要介绍了使用 Ionic 和 Cordova 开发混合应用时如何添加用户身份认证。教程简易,对于 Ionic 入门学习有一定帮助。因为文章是去年发表,所以教程内关于 Okta 的一些使用步骤不太准确,但是通过 Okta 的官网也可以找到对应的内容。另外,使用 npm 安装 Ionic starter 模板可能会有安装失败的情况,建议不要在这方面浪费太多时间,可以直接在 Ionic 的 GitHub 仓库 中下载 starter 模板。 原文:How to Sprinkle ReactJS i
叙帝利
2018/05/28
23.9K0
PWA入门:手把手教你制作一个PWA应用
Web前端的同学是否想过学习app开发,以弥补自己移动端能力的不足?但在面对一众的选择时很多同学略感迷茫,是学习ios还是android开发?是学习原生开发、混合开发(比如:Ionic),还是使用react native或者flutter这样的跨平台框架?而app开发的学习周期长、学习成本高也让一部分人望而却步。得益于前端技术的飞速发展、浏览器性能的不断提高,使用网页技术开发出接近原生体验的应用得以变为现实,PWA就在这样的背景下应运而生。可以用自己熟悉的HTML、CSS、Javascript开发出媲美原生app的网站,不仅拥有接近原生app的流畅程度,并且具备一些原生app才有的特性,比如:a. 可以在主屏上安装应用图标,b. 离线状态下访问,c. 获取消息通知,等等。。PWA的出现让大家看到了希望!
MudOnTire
2019/07/02
3.9K0
PWA入门:手把手教你制作一个PWA应用
如何使用JavaScript UI控件,构建Electron应用程序[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 概述 What is Electron? Electron是一个使用JavaScript、HTML和CSS构建跨平台桌面应用程序的框架。 您可以将Electr
全栈程序员站长
2022/08/04
1.3K0
如何使用JavaScript UI控件,构建Electron应用程序[通俗易懂]
Ionic3 导航分析
路由是前端构建单页面应用(SPA)必不可少的一部分,AngularJS1.x中有两种路由实现,一个是内置的ngRouter,还有一个是基于 ngRoute 开发的第三方路由模块uiRouter。这里为什么要提uiRouter?因为就自我感觉而言uiRouter 和 ionic导航在使用方式上有点像,特别是从它们提供的指令这一层来考虑。如果你没有了解过Angular4中的路由,其实也可以简单看看uiRouter的使用,不需要了解的多详细,仅仅理解它的那个指令的使用方式就可以了。
spilledyear
2018/08/21
2.1K0
Ionic3 导航分析
ionic2实现扫描二维码功能
注意使用该插件不能使用 1. 安装插件 // 安装平台插件 ionic cordova plugin add cordova-plugin-qrscanner // 安装ionic2插件 npm install --save @ionic-native/qr-scanner ---- 2.使用插件 1.创建扫描二维码的页面 ionic generate page qrdcan 2.页面跳转到扫码页面 跳转方法 // 跳转扫码页面 goQrdcan(){ this.navCtrl.p
用户1437675
2018/08/20
1.4K0
ionic4初级教程-含登录、访问权限验证功能
如果第一次安装的时候失败,没关系 删掉已经生成的ioinc4Learn文件包,重新运行命令
lilugirl
2019/05/28
2.6K0
ionic4初级教程-含登录、访问权限验证功能
【组件篇】ionic3分组索引及锚点滚动列表
好久没有写文章了,趁着吃完饭消化的时候打算写一篇。先前一篇文章提到并关注的capacitor终于出到1.0.0-alpha.5了,本想写它,但是内容比较多,所以先放一下,写别的。
IT晴天
2018/08/20
1.5K0
【组件篇】ionic3图像手指缩放滑动预览
我在一篇文章【组件篇】ionic3开源组件提到过图像预览组件,可以看里面的源码,也可以看下面内容。
IT晴天
2018/08/20
1.6K0
推荐阅读
相关推荐
Mobile first! Wijmo 5 + Ionic Framework之:Hello World!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验