我有幾個基本上做同樣事情的模型,所以我試圖用存儲在服務中的通用「BaseModel」進行重構。AngularJs 1.6將服務函數傳遞給一個通用模型在我的項目中丟失了上下文
在我的舊模型中,我注入了一個'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'。基本上,我卡住了。
是否有解決此問題的好方法?也許甚至是「角度」的方式?
提前致謝!