Knockotjs验证。由于VM内的属性顺序,传递函数给出了undefined

时间:2014-05-12 08:31:47

标签: javascript knockout.js knockout-validation

如果验证属性放在" HasError"之后,

验证工作正常。 VM中的属性。 如果属性放在HasError之前,我将得到" parameters.hasError"如未定义。我认为这是因为财产" HasError"当时没有定义。 是否有任何解决方案,而无需更改VM内的属性顺序,以使其工作。

谢谢!

self._BusTypeDefault = function(param) {
            var ret = param.BusType;

            if(typeof(ret)==='undefined') {
                ret = '';
            }
            else if(ko.isObservable(ret)) {
                ret = ret.peek();   
            }

            return ret;
        };

         self.BusType = ko.observable(self._BusTypeDefault(init)).extend({maxLength: {message: $Resources.PCIBUSError(), maxFieldLength: 255,hasError: self.HasError }});           

    self._HasErrorDefault = function(param) {
            var ret = param.HasError;

            if(typeof(ret)==='undefined') {
                ret = false;
            }
            else if(ko.isObservable(ret)) {
                ret = ret.peek();   
            }

            return ret;
        };

        self.HasError = ko.observable(self._HasErrorDefault(init)).extend({errorAggregation: {}});  

ko.extenders.maxLength = function (target, parameters) {
  //add some sub-observables to our observable
  target.hasMaxLengthError = ko.observable();
  target.validationMessageMaxError = ko.observable();

  //define a function to do validation
  function validate(newValue) {
    var preValue = target.hasMaxLengthError();

    if (newValue.length >= parameters.maxFieldLength) {
      target.hasMaxLengthError(true);
      target.validationMessageMaxError(parameters.message || "This field is required");
    }
    else {
      target.hasMaxLengthError(false);
      target.validationMessageMaxError("");
    }

    if (parameters.hasError != null && target.hasMaxLengthError() !== preValue && typeof preValue !== 'undefined') {
      parameters.hasError(target.hasMaxLengthError());
    }
  }

  //initial validation
  validate(target());

  //validate whenever the value changes
  target.subscribe(validate);

  //return the original observable
  return target;
};

1 个答案:

答案 0 :(得分:0)

您可以使用函数来延迟hasError的解释:

    this.myObservable = ko.observable(1).extend({ myExtender : { hasError: function () { return self.hasError } } });

然后在扩展器中,您需要调用该函数来实际获取后面的观察结果:

ko.extenders.myExtender = function (target, params) {
    function validate(newValue) {
        alert("New Value: " + newValue + " ; Has Error: " + params.hasError()());
    }
    target.subscribe(validate);
}

请参阅此示例:http://jsfiddle.net/7ywLN/