Ho implementato un Pattern Builder in un progetto su cui sto lavorando.
Sto usando questo modello di progettazione per creare campi e componenti (div, tabelle, pannello (boostrap)).
Quindi ho una classe Component Director. Fa un ordine per un costruttore (in questo caso InputComponentBuilder)
class @DirectorComponent
@builder = null
@make = (args...)->
@builder.make.apply(@builder, args)
@setResult(result = @builder.getResult())
return result
@makeInput = (name, properties)->
@builder = new InputComponentBuilder()
return @make.apply(@, arguments)
Sorgente di InputComponent Builder
class @InputComponentBuilder extends Builder
constructor : ()->
@input = new InputComponent()
make : (name, properties)->
@input.extend(properties)
@input.setName(name)
obj = $("<input />")
obj.attr("name", name)
obj.val(@input.value)
if @input.placeholder
obj.attr("placeholder", @input.placeholder)
obj = BuilderHelper.applyProperties(@input, obj)
obj = BuilderFieldHelper.applyProperties(@input, obj)
@input.setObject(obj)
@setResult(@input)
return @input
InputComponentBuilder è per campi di input generici. Quindi se voglio creare campi specifici come (EmailField, ZipCodeField .. etc) avrò bisogno di creare un altro builder esteso a InputComponetBuilder
? o in classe Director
Dovrò creare un altro metodo makeZipCodeField
e cambiare la ricetta inviata a InputBuilder?
Base Class (classe Base del risultato di Class Builder)
class @Component
constructor : ()->
@id = null
@name = ""
@obj = null
@attrs = {}
@classes = []
@css = {}
extend : (data)->
$.extend(@, data)
getObject : ()->
return @obj
setObject : (obj)->
@obj = obj
setName : (name)->
@name = name
getName : ()->
return @name
getPropertiesFromObjectComponent : (args...)->
result = []
console.log(args, arguments)
for key, arg of args
console.log key, arg
result.push(if arg of @ then @[arg] else null)
console.log(result)
return result
Classe astratta per campi
class @FieldComponentAbstract extends Component
constructor : ()->
super
@label = null
@placeholder = null
@onclick = null
@onchange = null
@onfocus = null
@onkeypressed = null
@onkeyup = null
@onkeydown = null
@oninsertednode = null
@bootstrap = null
@onblur = null
@mask = null
@validate : ()->
return true
Classe InputComponent
class @InputComponent extends FieldComponentAbstract
constructor : ()->
super
@type = "text"
@value = ""
Chiamata makeInput
@cpf_field = DirectorComponent.makeInput('cpf',
placeholder: "CPF",
mask : '999.999.999-99'
bootstrap: true
)