Knockout.js 在淘汰模型中只循环属性而不循环函数

Knockout.js 在淘汰模型中只循环属性而不循环函数,knockout.js,bdd,jasmine,knockout-2.0,knockout-validation,Knockout.js,Bdd,Jasmine,Knockout 2.0,Knockout Validation,我试图通过在测试中调用self.isModelvalid手动验证我的模型,并假设我将返回true,因为在调用它之前,我为模型中的所有属性分配了测试值。以下是我在测试中的调用方式 listingViewModel = new ListingViewModel(); listingViewModel.country('a'); listingViewModel.city('a'); listingViewModel.cummunity(

我试图通过在测试中调用
self.isModelvalid
手动验证我的模型,并假设我将返回
true
,因为在调用它之前,我为模型中的所有属性分配了测试值。以下是我在测试中的调用方式

        listingViewModel = new ListingViewModel();
        listingViewModel.country('a');
        listingViewModel.city('a');
        listingViewModel.cummunity('a');
        listingViewModel.subCummunity('a');
        listingViewModel.postCode('1');        
        expect(listingViewModel.isModelValid()).toBe(true);
这是我的源类,其中存在我的模型和所有方法:

        function validateModel(model) {
      var self = model;
       for (var prop in self) {
       if (self.hasOwnProperty(prop)) {
         if (!(self[prop].isValid())) {
            return false;
          }
       }
    }

   return true;

 }

   function ListingViewModel() {
   var self = this;
    self.country = ko.observable('').extend({required : true});
   self.city = ko.observable('').extend({ required: true });
  self.cummunity = ko.observable('').extend({ required: true });
   self.subCummunity = ko.observable('').extend({ required: true });
    self.postCode = ko.observable('').extend({ required: true });

    self.isModelValid = function () {

      validateModel(self);

    };

   self.addListing = function () {

    };
   }


    ko.validation.configure({
   decorateElement: false,
   errorElementClass: "error",   // class name
   insertMessages: false,
   grouping: { deep: true, observable: true }
  });
当我运行时,它说

listingViewModel.isModelValid() TypeError: self[prop].isValid is not a function
我认为当它尝试验证isModelValid时会出现这个错误,因为isModelValid不是一个函数,而是它的属性

因此,如何只验证淘汰模型中的属性


感谢

从技术上讲,
ko.可观察的
也是一种功能。因此,在您的例子中,
ListingViewModel
的每个成员都是一个函数

您需要检查给定成员上是否存在
isValid
属性

幸运的是,knockout validation插件有一个很好的实用功能来检查这一点,即:
ko.validation.utils.isvalidable

因此,您需要修改
validateModel
以使用上述函数检查
isValid
属性是否存在:

 function validateModel(model) {
      var self = model;
       for (var prop in self) {
       if (self.hasOwnProperty(prop)) {
         if (ko.validation.utils.isValidatable(self[prop]) 
             && !(self[prop].isValid())) {
            return false;
          }
       }
    }

演示

谢谢你救了我。非常感谢