0

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

この問題を回避する方法はありますか?おそらく「角度のある」方法ですか?

ありがとうございます!

答えて

0

私の単体テストで問題を完全に再現することはできませんでしたが、明らかにこの問題は回避できます...アイデアはあなたが 'this'を使わずに

validatorService.prototype.isValidName = (string)-> 
    regexp = validatorService.prototype.internationalLettersNumbers("{1,60}") 
    return validatorService.prototype.isRegexpMatch(string, regexp) 
を明示的に参照してください。
関連する問題