手动创建计算属性

时间:2014-04-29 09:41:00

标签: javascript ember.js

这是问题所在。我目前正在创建一个mixin来处理表单验证。问题是我想在init方法中创建一个计算属性isFormValid,它是'computed.and'其他属性的'is<fieldName>Valid'属性。

我可以创建它,但它永远不会更新。我想我需要添加观察者,但也许有人会有更好的解决方案?

修改
这是一些澄清。

我的控制器获得了该属性:

App.FormViewController = Ember.Controller.extend(App.ValidatorMixin, {
    validations: {
        field1: {
            errLvl: App.Validation.ErrLvl.ERROR,
            type: App.Validation.Type.TEXT,
            pattern: /^\d{6}$/,
            message: 'Error message'
        },
        field2: {
            //somecode
        }
    }
});

mixin定义如下:

App.ValidatorMixin = Ember.Mixin.create({
    init: function() {
        this._super();

        var self = this;
        Ember.keys(this.validations).forEach(function(prop) {
            self.set('is' + prop.capitalize() + 'Valid', false); //Is changed when the field is valid
        });
    }
});

isFormValid属性应为Ember.computed.and所有is<fieldName>Valid

App.Mixin.ValidatableInput = Ember.Mixin.create({ focusOut: function() { this.validate(); }, //Do the validation validate: function() { //I'm currently moving that part to the controller because it's part //of the logic but it was easier for a start to write it here //We update the is<fieldName>Valid property this.get('parentView.controller').set('is' + this.get('name').capitalize() + 'Valid', !hasError); //Then some DOM manipulation to attach the error message } });

EDIT2
表单上的每个输入都由输入助手和这个mixin定义:

{{view App.CustomTextField name="field1" value=field1}}
{{view view.buttonCreate disabled=isFormInvalid}}

最后我的观点看起来像那样

{{1}}

2 个答案:

答案 0 :(得分:0)

init方法中,您可以使用defineProperty设置计算属性。

Ember.defineProperty(myObject, 'myProperty', Ember.computed(function computed() {

    return 'myValue';

}).property('myObserver'));

答案 1 :(得分:0)

这对你有用吗? (扩展@Wildhoney,我无法发表评论)。如果您有多个属性,则可以指定多个属性:

Ember.defineProperty(myObject, 'myProperty', Ember.computed(function computed() {

    return 'myValue';

}).property('myObserver.@each.myObservedProperty'));

我在Ember中通过触发.validate()调用和表单视图的didInsertElement规则获得了jQuery Validate的运气,然后当你从每个Ember中聚焦时进行.valid()检查。文本域。我强烈推荐它进行表单验证。