Javascript迭代一组属性

时间:2013-06-18 15:56:25

标签: javascript knockout.js knockout-validation

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

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

3 个答案:

答案 0 :(得分:1)

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)
}
}

答案 1 :(得分:1)

eis在评论中给了你一部分,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 :(得分:0)

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

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

有关详细信息,请参阅上述链接。