當前位置:
首頁 > 知識 > Angular表單控制項需要類型和實際值類型不一致時實現雙向綁定

Angular表單控制項需要類型和實際值類型不一致時實現雙向綁定


適用Angular版本為:>=2。本文同樣適用於Ionic這類的基於Angular實現的框架。 本文的思路也適用於控制項顯示的值和實際的值不一樣時實現雙向綁定。

1. 問題描述

在使用md2的datepicker控制項時,遇到這樣的問題,datepicker綁定的類型要求是Date類型,但是傳輸後台需要的類型是基於YYYY-MM-DD的日期字元串,但是Date類型默認轉換為字元串是這樣的:Fri Jun 02 2017 16:03:50 GMT+0800 (China Standard Time),導致後台沒有正確的處理日期。

這個問題可以從後台處理,提供對應格式的反序列化,但是不是最佳方案。日期類型基於不同的語言區域平台,其默認生成的格式也是不一樣的。

那麼如何在前端從根源上處理呢?


2. 思路分析

剛開始考慮了兩種方案:

1、通過聲明gettersetter方法,綁定對應的gettersetter屬性,但是這樣會造成綁定時臟檢查的死循環問題,所以否定這種方案;

2、通過Pipe,來實現將字元串轉換為Date類型,實現綁定,但是這只能解決單向綁定,對於雙向綁定也無能為力。

最後,考慮能否結合以上兩種方案呢?

好的,結果是成功的,我們下面就來介紹如何一步一步的解決這個問題。


3. 問題解決

3.1. 示例model定義

這裡定義一個People的示例model,只有一個屬性birthday,為string類型。

import * as moment from "moment";

export class People
{
birthday: string = "";

set ParseBirthday(val: Date){
this.birthday = moment(val).format("YYYY-MM-DD");
}
}

在這裡我們生成了一個setter方法,用來將Date類型數據轉換為對應格式的string類型。

3.2. 定義string類型單向綁定的pipe

代碼如下:

import { Pipe, PipeTransform } from "@angular/core";
import * as moment from "moment";

@Pipe({
name: "stringToDate",
})
export class StringToDatePipe implements PipeTransform {

transform(value: string, format: string, ...args) {
if(!format) format = "YYYY-MM-DD";
if(!!value && moment(value, format).isValid){
var dVal = moment(value, format);
return dVal.toDate;
}
return null;
}
}

這個Pipe的目的就是將String類型轉換為Date,這裡可以傳遞一個format參數,為String類型對應的日期格式。

3.3. 最後我們進行一種改造的雙向綁定

上面我們將原本基於[(ngModel)]的雙向綁定,拆分成了一個單向綁定[ngModel]和一個ngModelChange事件處理,其中[ngModel]的單向綁定,是通過3.2節中定義的PipeString類型的birthday轉換為Date類型進行綁定;然後當數據改變時,通過(ngModelChange)事件,通過setter方法將Date類型重新轉換為String,並賦值給birthday

OK,問題解決了,完工。


附錄

本文中使用了Moment.js來進行日期格式處理,可以通過如下命令安裝相關依賴:

npm install moment --save

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

開啟Sqlserver遠程訪問
springmvc(四)springmvc的數據校驗的實現

TAG:科技優家 |

您可能感興趣

能改變形狀的Aquanaut結合兩種類型水下機器人的特性
時下流行的logo設計類型有哪些?
Adobe Reader類型混淆導致代碼執行漏洞分析
VirtualLink新標準讓下一代VR設備使用相同類型的電纜
Chrome 66 新特性:CSS 類型對象模型,非同步剪貼板 API,AudioWorklet,等
Perl 數據類型
Python基礎數據類型考試題你能及格嘛?
Decentraland設計體驗——在去中心化的世界中構建遊戲時,如何做到平衡玩家類型、遊戲機制和技術限制
Redis 數據類型
python 魔術方法 : 讓自定義類更像內置類型
Swift 類型轉換
Nature:大規模實驗揭示出全新類型的抗結核病抑製劑
python基礎數據類型
7種類型的Logo設計:哪種Logo適合您?
Hibernate 映射枚舉Enum 類型的屬性
opencv Mat類型和BYTE*指針類型互轉
Staem模擬類型的遊戲,絕對的真人體驗
新面孔Fashion】超模講堂,不同類型的時裝表演應該如何化妝?
EF Core的三種主要關係類型
Google出品的Python代碼靜態類型分析器:Pytype