2017-07-19 22 views
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) 
相關問題