本文主要示例在ionic3.x环境下实现一个自定义计数器,实现后最终效果如图:

1、使用命令创建一个component

  1. ionic g component CounterInput

类似的命令还有:

  1. ionic g page YourPageName //创建新页面
  2. ionic g directive YourPageName //创建指令
  3. ionic g component YourComponentName //创建组件
  4. ionic g provider YourProviderName //创建服务
  5. ionic g pipe YourPipeName //创建过滤器

命令执行完成后自动生成文件如图:

2、到这里我们已经初步创建了一个自定义组件,接上来我们需要将我们的组件添加到app.module.ts的declarations数组里,以便其实页面进行调用。一般情况下我们执行完命令ionic已经自动帮我们添加进来了,但如果没有的话请自行添加。代码如下:

  1. import { CounterInputComponent } from '../components/counter-input/counter-input';
  2.  
  3. .....
  4.  
  5. @NgModule({
  6. declarations: [
  7. ...
  8. CounterInputComponent
  9. ...
  10. ],
  11. imports: [
  12. ...

3、接下来我们具体实现

counter-input.html 页面代码如下:

  1. <ion-icon class="add" name="ios-remove-circle-outline" (click)='decrement()'></ion-icon>
  2. <ion-input type="number" value="1" [(ngModel)]='counterValue'></ion-input>
  3. <ion-icon class="min" name="ios-add-circle-outline" (click)='increment()'></ion-icon>

counter-input.ts 页面代码如下:

  1. import { Component, Input, forwardRef } from '@angular/core';
  2. import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
  3. @Component({
  4. selector: 'counter-input',
  5. templateUrl: 'counter-input.html',
  6. providers: [{
  7. provide: NG_VALUE_ACCESSOR,
  8. useExisting: forwardRef(() => CounterInputComponent),
  9. multi: true
  10. }]
  11. })
  12. export class CounterInputComponent implements ControlValueAccessor {
  13. @Input() counterValue: number;
  14. private propagateChange: any = {};
  15. increment() {
  16. this.counterValue++;
  17. this.propagateChange(this.counterValue);//值传递
  18. }
  19. decrement() {
  20. this.counterValue--;
  21. this.propagateChange(this.counterValue);//值传递
  22. }
  23.  
  24. /*实现ControlValueAccessor接口部分*/
  25. writeValue(val: number): void {
  26. if (val) {
  27. this.counterValue = val;
  28. }
  29. }
  30. registerOnChange(fn: any): void {
  31. this.propagateChange = fn;
  32. }
  33. registerOnTouched(fn: any): void {
  34. }
  35. setDisabledState?(isDisabled: boolean): void {
  36. }
  37.  
  38. }

4、到这里我们的自定义控件已经实现完了,下面是调用

  1. <counter-input [(ngModel)]='counterValue'></counter-input>

总结:为了使自定义组件实现双向绑定(页面的传可以传递到组件,组件将值修改后又传递到页面),我们实现了ControlValueAccessor接口,实现完ControlValueAccessor接口后我们可以在调用组件的时候直接使用ngModel进行双向绑定。

参考文档:

https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html

http://www.jianshu.com/p/a01015d5d83b

ionic3.x angular4.x ng4.x 自定义组件component双向绑定之自定义计数器的更多相关文章

  1. vue 自定义组件 v-model双向绑定、 父子组件同步通信

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  2. vue 自定义组件 v-model双向绑定、 父子组件同步通信【转】

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  3. 自定义组件实现双向绑定v-model

    自定义组件实现 v-model 双向绑定,首先要先明白 v-model,这个指令到底实现了什么? v-model实际做的事情就是:传入一个value属性值,然后监听input事件返回一个值,用该返回值 ...

  4. Android自定义组件系列【4】——自定义ViewGroup实现双侧滑动

    在上一篇文章<Android自定义组件系列[3]--自定义ViewGroup实现侧滑>中实现了仿Facebook和人人网的侧滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布局示 ...

  5. 7.vue组件(二)--双向绑定,父子组件访问

    本文主要说两件事 1. 如何实现父子组件之间的双向绑定 2. 父组件如何访问子组件的data,method, 子组件如何访问父组件的data,method等 一. 如何实现父子组件之间的双向绑定 案例 ...

  6. 如何在Vue2中实现组件props双向绑定

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...

  7. 自定义组件Component

    定义compa组件 由4个页面构成 compa.js: compa.json: compa.wxml: compa:wxss: 1.compa.json:在json文件进行自定义组件声明 { &quo ...

  8. 微信小程序自定义组件的使用以及调用自定义组件中的方法

    在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说 ...

  9. Yii2.0 高级模版编写使用自定义组件(component)

    翻译自:http://www.yiiframework.com/wiki/760/yii-2-0-write-use-a-custom-component-in-yii2-0-advanced-tem ...

随机推荐

  1. QueryRunner类的八种结果处理集

    package cn.jy.demo; import java.sql.Connection; import java.sql.SQLException; import java.util.List; ...

  2. 纯css导航栏下划线

    .nav-underline > *{/* 指定容器,里面可以是li.span等多样化的元素 */ display: inline-block; margin: -3px; padding: 1 ...

  3. 在WebGrid中做 批量删除操作

    一般的MVC WebGrid都是在每一行中加入 Edit Detail Delete 这些Link 去对每条记录去单独操作. 稍微研究了一下总结一个 做批量删除的办法. 1. 首先是在WebGrid中 ...

  4. Alpha 冲刺 (4/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  5. spring boot中注入jpa时报could not autowire.No beans of 'PersonRepository' type found

    解决方法,在repository加一个注解.如下图所示: @Component

  6. python模块:sys

    # encoding: utf-8 # module sys # from (built-in) # by generator 1.145 """ This module ...

  7. UVa 10163 Storage Keepers (二分 + DP)

    题意:有n个仓库,m个管理员,每个管理员有一个能力值P,每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,...),雇用的管理员的工资即为 ...

  8. location位置操作

    使用location对象可以通过很多方式来改变浏览器的位置. location.assign('http://www.klkx.com') 传入一个URL地址 这样可以立即打开一个新的URL并在浏览器 ...

  9. Arria10_emif

    DDR3 由排(Rank),体(Bank),行(Row),列(Column)组成的四维结构. Arria10是第一批支持ddr4的altera Arria10与老器件相比的新结构 (1)  更多的硬( ...

  10. SQL常用增删改查

    转 http://www.cnblogs.com/daxueshan/p/6687521.html 1增 1.1[插入单行]insert [into] <表名> (列名) values ( ...