在我的项目中我有一些基本上做同样事情的模型,所以我试图用存储在服务中的通用“BaseModel”进行重构。
在我的旧模型中,我注入了一个'ValidatorService'并调用了某些函数,例如'ValidatorService.isValidStreetNumber(streetNumber)'。这很好,因为Model服务可以直接调用ValidatorService(Singleton)函数。
请注意,以下是我使用原型继承匿名传递验证/规范化函数。 (typeValidator,contentValidator,contentNormalizer)
现在我的泛型类看起来像这样(Coffeescript):
app = angular.module 'app'
BaseModel = ()->
Model = (data, defaultData, isRequired, errorMessage, \
typeValidator, contentValidator, contentNormalizer)->
this.defaultData = defaultData
this.isRequired = isRequired
this.errorMessage = errorMessage
this.typeValidator = typeValidator
this.contentValidator = contentValidator
this.contentNormalizer = contentNormalizer
this.data = this.initialValue(data)
this.isValid = this.contentValidator(this.data)
return
Model.prototype.initialValue = (value)->
if not this.typeValidator(value)
return this.defaultData
return value
Model.prototype.updateValidity = ()->
this.isValid = this.isValidModel()
return
Model.prototype.isValidModel = ()->
if not this.typeValidator(this.data)
return false
emptyOptional = not this.isRequired and
angular.equals(this.data, this.defaultData)
return emptyOptional or this.contentValidator(this.data)
Model.inherit = (data, defaultData, isRequired, errorMessage, typeValidator, contentValidator, contentNormalizer)->
return Object.create(new Model(data, defaultData, isRequired, errorMessage, typeValidator, contentValidator, contentNormalizer))
return Model
BaseModel
.$inject = []
app
.service 'BaseModel', BaseModel
简单继承类的初始化如下所示:
Street = (streetName)->
defaultData = ""
isRequired = true
errorMessage = ValidatorService.errorMessageStreet()
typeValidator = ValidatorService.isValidString
contentValidator = ValidatorService.isValidStreet
return BaseModel.inherit(streetName, defaultData, isRequired, \
errorMessage, typeValidator, contentValidator)
如果传递的函数是隔离的并且不引用任何其他函数,则此方法可以正常工作。但是,由于我的“ValidationService”函数使用“this。”调用其他函数,因此匿名函数会抛出错误。
示例:
this.isValidName = (string)->
regexp = this.internationalLettersNumbers("{1,60}")
return this.isRegexpMatch(string, regexp)
我唯一能想到的是使验证函数不引用任何其他函数或库。但是,这不是我的解决方案,因为我还引用了其他服务,例如'LocaleService'。基本上,我被卡住了。
这个问题有好办法吗?也许甚至是一种“棱角分明”的方式?
提前致谢!
答案 0 :(得分:0)
所以显然这个问题可以通过以下方式避免,即使我无法在单元测试中完全重现问题...这个想法是你不使用'this',而是明确地引用服务返回的模型对象:
retrieveConnectedPeripheralsWithServices