将服务函数传递给泛型模型的AngularJs 1.6丢失了上下文

时间:2017-07-19 11:53:45

标签: javascript angularjs service model prototypal-inheritance

在我的项目中我有一些基本上做同样事情的模型,所以我试图用存储在服务中的通用“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'。基本上,我被卡住了。

这个问题有好办法吗?也许甚至是一种“棱角分明”的方式?

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以显然这个问题可以通过以下方式避免,即使我无法在单元测试中完全重现问题...这个想法是你不使用'this',而是明确地引用服务返回的模型对象:

retrieveConnectedPeripheralsWithServices