2015-10-25 4 views
5

抽象的なコントロールから継承するUIコントロールを持っています。抽象的なコントロールで を継承しています。すべてのコントロールがtrue/falseを返すisValidというメソッドを拡張する必要があり、 ) これを赤色(非有効な場合)にするかどうかを知るには、この場合私がこれを助けるために使用すべき設計パターンがありますか、どのアプローチを使用すべきですか?コントロールからフレームワークにステータスを送信

+1

は、私にはかなり固体に聞こえます。あなたは[codereview.se]にあなたのコードを投稿して、堅実なレビューを得ることができます。 –

+0

@ MadaraUchiha - ありがとう、しかし、私はそれを実装しようとする前に正しいアプローチを見つけたいと思っています:)どのような提案? –

+3

ここにデザインパターンをくりかける必要はありません - これは簡単な多形性です。 – dbugger

答えて

3

純粋なJavascriptで開発している場合(ReactやAngular、jQueryはありません)、DOM要素で使用可能な既存のObserver Patternを使用して変更を更新します。

要約パーツ:

// Create the basic AbstractControl class. 
var AbstractControl = function() { 

} 

// Virtual methods. 
AbstractControl.prototype.isValid = function() { 
    throw new Error('Not implemented.') 
} 

AbstractControl.prototype.paintGreen = function() { 
    // Valid case. 
    throw new Error('Not implemented.') 
} 

AbstractControl.prototype.paintRed = function() { 
    // Invalid case. 
    throw new Error('Not implemented.') 
} 

// Function Update verifies the validity of the control and calls 
// the valid or invalid case accordingly. 
AbstractControl.prototype.update = function() { 
    if (this.isValid()) { 
     this.paintGreen(); 
    } else { 
     this.paintRed(); 
    } 
} 

そして、例えば、具体的な制御クラス:

// Class for an email input text field, receives a DOM element. 
var EmailField = function(element) { 
    AbstractControl.call(this, AbstractControl); 
    this.element = element; 
    // Listens for change events on the element and updates 
    // the valid/invalid status. 
    this.element.addEventListener("change", this.update.bind(this)); 
} 

// Setup inheritance. 
EmailField.prototype = Object.create(AbstractControl.prototype); 
EmailField.prototype.constructor = EmailField; 

// Implement virtual methods. 

EmailField.prototype.isValid = function() { 
    return this.element.value.indexOf("@") >= 0; 
} 

EmailField.prototype.paintGreen = function() { 
    alert("Email correct. Proceed.") 
} 

EmailField.prototype.paintRed = function() { 
    alert("Email Incorrect! May not proceed.") 
} 

最終使用:

new EmailField(document.getElementById("emailfield")); 

そして、それはすべての変更にalertは、フィールドの内容に応じたでしょう。 alertを変更して(機能名に示されているように)要素の色を変更するか、アイコンまたはツールチップを表示することができます。

JSFiddle:https://jsfiddle.net/surj64vy/(リアルタイムで変更を取得するより多くのイベントを使用して、文字通りの代わりに警告のフィールドを塗る)

+0

私は100%の質問をよく理解していません。この回答は役に立ちますか? – BoppreH

+0

1+ありがとう、これは多かれ少なかれ2つの質問です。1.具体的なクラスからイベントを送信するにはどうすればよいですか?私はjsFiddlleでそれを使用しようとすると、それは私のために働くdoesntあなたjsBIn /フィドル...または何かとしてそれを送信してくださいできますか?私はそれをテストしたいと思いますありがとう! –

+0

1.各変更に対して 'update'メソッドが既に呼び出されており、イベントに応答することができます。 2.確かに、ここにそれがあります:https://jsfiddle.net/surj64vy/ – BoppreH

関連する問題