这是一个技术问题的设计问题,但由于有一个名为design-patterns
的标签,我认为这是有道理的。
我的方案如下:我有一个CSV文件,我想用它来填充一个对象,然后使用该对象进行API调用。到现在为止还挺好。
棘手的部分是CSV数据在填充对象之前可能需要一些转换,一旦创建并填充了对象,我想编辑其中一些对象属性。
视图和控制器操作将由angular提供,我专注于模板的东西。
对象是如何组成的?好吧,我的想法如下:
value
属性,这样angular就可以实现双向数据绑定魔法。它还有一组用于查询和与对象交互的方法,比如请求对象类(ng-dirty
,如果它是必需的和空的),如果它是一个集合而不是单个值,则添加另一个元素,还有那种东西。要构建此对象,我将以这种方式继续:
一些构造函数构建在其他构造函数之上。例如,arrayConstructor
使用基本构造函数,它扩展了基本构造函数返回的对象,然后返回它。 arrayConstructor
使用limitedValuesConstructor
,依此类推。如果你没有注意到,如果没有定义,一些构造函数会回退到默认解析器。
我的想法是希望这是可扩展的,所以如果将来如果数据格式发生变化,我只需要添加另一个解析器,或者更新现有的解析器。构造函数的内容相同。
但是,我觉得我会为这项任务复杂化,我想要你的意见。令我害怕的另一件事是,我觉得这不符合我所知道的任何有效设计模式。它不是典型的,不是经典的,不是模块模式(闭包),我不熟悉构图,但我觉得这也不是有效的构图。
下面你可以找到一个闭包内的基本代码。
(function () {
function ruleFactory (type,required,constructor,options) {
constructor = constructor || basicConstructor;
var column = {
'type': type,
'required': required || false,
'parser': options && options.parser ,
'constructor': function (data) { return constructor.apply(column,[data,required,options])}
};
return column
}
function strParser (data){
if( typeof data === "string" ){
return data
} else if( data && data.toString){
return data.toString();
}
return ''
}
function arrParser (data){
if(!data){
return []
}
if( angular.isArray(data) ){
return data
}
return strParser(data).split(' ');
}
function basicConstructor (data,required) {
var parser = this.parser || strParser; //fallback to the most basic parser
var column = {};
column.value = parser(data);
column.getClass = function (){
if( required && ! this.value ){
return 'ng-dirty'
}
return ''
};
return column
}
function arrConstructor (data,required) {
this.parser = this.parser || arrParser; // default parser for this constructor
var column = basicConstructor.apply(this,arguments);
column.addValue = function (value) {
column.value.push(value);
}
column.getClass = function ( ) {
if ( column.value.length <= 0 && required ) {
return 'ng-dirty'
}
return ''
}
return column
}
})()
“规则”对象(或数组或任何你想要的)构建如下:
var rules = {
"someColName": ruleFactory('number',true), // true means required. Defaults to false
"someList" : ruleFactory('array',false,arrConstructor), //No parser defined, so fallbacks to default parser for arrConstructor
"otherList" : ruleFactory('array',false,arrConstructor, {parser:arrParser}) }
非常欢迎任何意见/建设性批评。
此致