2015-10-25 25 views
5

Posiadam formanty interfejsu użytkownika, które są dziedziczone z abstrakcyjnej kontroli, w formancie abstrakcji Mam metodę, którą każda kontrola powinna rozszerzyć, która jest nazywana wartością isValid, która zwraca wartość true/false i jest mi potrzebna (jako struktura) wiedzieć, czy oznaczyć go na czerwono (nieważny przypadek), istnieje wzorzec projektowy, który powinienem użyć w tym przypadku, aby pomóc mi w tym lub w jakim podejściu powinienem użyć?Wysyłanie stanu z formantów do architektury ramowej

+1

Brzmi całkiem solidne mnie. Możesz opublikować swój kod na [codereview.se], aby uzyskać solidną recenzję. –

+0

@MadaraUchiha - Dzięki, ale chcę znaleźć właściwe podejście, zanim zamierzam je wdrożyć :) jakakolwiek sugestia? –

+3

Nie ma tu potrzeby zaklinowywania wzorca projektu - jest to prosty polimorfizm. – dbugger

Odpowiedz

3

Jeśli pracujesz w czystym Javascript (tj. Bez React lub Angular lub jQuery), używałbym istniejącego Observer Pattern dostępnego w elementach DOM do aktualizacji zmian.

Abstrakt:

// 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(); 
    } 
} 

i przykład beton klasy kontrola:

// 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.") 
} 

Finał Wykorzystanie:

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

I byłoby alert na każdej zmianie w zależności od zawartości pola . Możesz zmienić alert, aby zamiast tego pokolorować elementy (jak pokazano w nazwie funkcji) lub wyświetlić ikonę lub etykietkę narzędzia.

JSFiddle: https://jsfiddle.net/surj64vy/ (używając więcej wydarzeń do przechwytywania zmian w czasie rzeczywistym, a dosłownie malowanie boiska zamiast ostrzegania)

+0

Nie jestem pewien, czy rozumiem pytanie w 100%. Czy ta odpowiedź pomaga? – BoppreH

+0

1+ Dzięki przypuszczam, że jest to mniej więcej 2 pytania 1.Jak mogę rzucić zdarzenie z konkretnej klasy, której e-maile nie są prawidłowe? 2. Próbuję użyć go w jsFiddlle i nie działa on dla mnie, czy możesz wysłać go jako jsBIn/fiddle ... czy coś? Chcę to przetestować Dzięki! –

+0

1. Metoda 'update' jest już wywoływana dla każdej zmiany, w której można odpowiedzieć na zdarzenie. 2. Oczywiście, tutaj jest: https://jsfiddle.net/surj64vy/ – BoppreH