【问题标题】:Javascript iterating through a set of propertiesJavascript 遍历一组属性
【发布时间】:2013-06-14 22:37:52
【问题描述】:

您好,我创建了一个包含一组属性的函数对象。这就是我所拥有的:

function LoginModelDTO(data) {
    var self = this;

    self.UserName = ko.observable(data.UserName).extend({
        minLength: {
            params: 25,
            message: "Username should have at least 25 chars"
        },
        required: {

            message: "Username is required"
        },
        maxLength: {
            params: 50,
            message: "Username should not have more then 50 chars"
        },
        trackChanges: null
    });
    self.Password = ko.observable(data.Password).extend({
        stringLength: {
            params: 25,

        },
        required: {

            message: "Password is required"
        },
        trackChanges: null
    });
    self.RememberMe = ko.observable(data.RememberMe).extend({
        trackChanges: null
    });

self.isValid = ko.computed(function () {
        var bool = self.FirstName.isValid() &&
            self.Username.isValid() &&
            self.Password.isValid() &&
            self.RememberMe() &&
        return bool;
    });
}

我想要的是能够找到一种方法来迭代每个属性并询问它是否有效,而无需每次都编写每个属性,因为我还必须为 hasChanges 、 revertChanges 等编写类似 self.isValid 的结构。

此外,我将需要创建其他与 LoginModelDTO 类似的对象,它们具有大约 30-35 个属性。这将导致需要大量代码和更大的 javascript 文件。

有什么方法可以迭代只抛出属性并检查它们是否有效? isValid 应该被跳过

【问题讨论】:

  • for (propertyName in self) { // check for self[propertyName].isValid() } 并跳过您不想检查的那些?
  • 如果你不想重新发明轮子jqueryvalidation.org
  • 我正在使用淘汰赛进行验证,但是由于要求而扩展了它的功能
  • @mcgrailm 你知道,有时更好,所以重新发明轮子。如果你不这样做,你将不知道它是如何工作的,以及如何创建一个你没有的。

标签: javascript knockout.js knockout-validation


【解决方案1】:

eis 在 cmets 中给了你一部分,Misters 在答案中给了你一部分,但这里是全部:

var allValidatablesAreValid = true;
for (var property in self)
{
    if (self.hasOwnProperty(property) && self[property]["isValid"]) {
        allValidatablesAreValid = allValidatablesAreValid && self[property].isValid();
    }
    // You can add an early bail out here:
    // if (!allValidatablesAreValid) { break; }
}

【讨论】:

    【解决方案2】:

    WELL for..in 语句可以帮助您:

    var obj = {
    
    pro1:"hello",
    
    pro2:function(){
    //code here
    },
    etc:function(){
    
    }//...
    }
    
    for(var property in obj)
    {
    if(obj.hasOwnProperty(property))
    {
    console.log(property)//display the name of the property and of course the access
    }
    }
    

    要访问属性的值,您可以这样做:

    for(var property in obj)
    {
    if(obj.hasOwnProperty(property))
    {
    console.log(obj[property])//display the value of the property(in case that you need it)
    }
    }
    

    【讨论】:

      【解决方案3】:

      由于问题与 knockout-validation 库有关,我想我会展示如何使用库本身来做到这一点。

      self.isValid = ko.computed(function () {
          return ko.validatedObservable(self).isValid()
      });
      

      查看以上链接了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        • 2014-11-26
        • 1970-01-01
        • 2012-10-29
        相关资源
        最近更新 更多