私のプロジェクトでは基本的に同じことをするモデルがいくつかありますので、サービスに格納されている汎用の "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」のような他のサービスも参照しています。基本的に、私は立ち往生しています。
この問題を回避する方法はありますか?おそらく「角度のある」方法ですか?
ありがとうございます!