Javascript 敲除js css不';当更新子可观察项时,似乎不会重新计算

Javascript 敲除js css不';当更新子可观察项时,似乎不会重新计算,javascript,css,knockout.js,Javascript,Css,Knockout.js,我是一个新手,我不太会去敲,我试图去弄清楚观察值和计算出的观察值 更新:JS Fiddle:带有正在运行但已损坏的示例。在输入框中输入内容时,标签应变为绿色 我有一个这样的模型: var json = { name: 'Testing', items: [{ question: 'Question 1', answer: '', isrequired: true, isvisible: true, c

我是一个新手,我不太会去敲,我试图去弄清楚观察值和计算出的观察值

更新:JS Fiddle:带有正在运行但已损坏的示例。在输入框中输入内容时,标签应变为绿色

我有一个这样的模型:

var json = {
    name: 'Testing',
    items: [{
        question: 'Question 1',
        answer: '',
        isrequired: true,
        isvisible: true,
        complexObject: {
            FirstName: '',
            LastName: '',
            Email: ''
        }
    }, {
        question: 'Question 2',
        answer: '',
        isrequired: true,
        isvisible: true,
        complexObject: {
            FirstName: '',
            LastName: '',
            Email: ''
        }
    }]
};

var ViewModel = function () {
    var self = this;
    self.profile = ko.observable(new Profile(json));
};

var Profile = function (init) {
    var self = this;
    self.name = ko.observable(init.name);
    self.items = ko.observableArray([]);
    for (var i = 0; i < init.items.length; i++) {
        self.items.push(new ProfileItem(init.items[i]));
    }
};

var ComplexObject = function () {
    var self = this;
    self.name = ko.observable("");
    self.email = ko.observable("");
}

var ProfileItem = function (item) {
    var self = this;
    self.question = ko.observable(item.question);
    self.answer = ko.observable(item.answer);
    self.complexObject = ko.observable(new ComplexObject());
    self.isvisible = ko.observable(item.isvisible);
    self.isrequired = item.isrequired;
    self.cssclasses = ko.computed(function () {
        if (self.complexObject().Email != undefined && self.complexObject().Email().length > 0) {
            return "satisfied";
        } else {
            return "required";
        }
    });
};

ko.applyBindings(new ViewModel());
<div data-bind="foreach: profile().items">
    <div data-bind="css: cssclasses">
        <span data-bind="text: question"></span><br />
        <div data-bind="with: complexObject">
            <input data-bind="value: email" />
        </div>
    </div>
</div>
<div data-bind="text: ko.toJSON($root)"></div>
var json={
名称:'测试',
项目:[{
问题:"问题1",,
答复:",,
是的,
可见:是的,
络合对象:{
名字:'',
姓氏:“”,
电子邮件:“”
}
}, {
问题:"问题2",,
答复:",,
是的,
可见:是的,
络合对象:{
名字:'',
姓氏:“”,
电子邮件:“”
}
}]
};
var ViewModel=函数(){
var self=这个;
self.profile=ko.observable(新配置文件(json));
};
变量配置文件=函数(初始化){
var self=这个;
self.name=ko.observable(初始名称);
self.items=ko.observearray([]);
对于(var i=0;i0){
返回“满意”;
}否则{
返回“必需”;
}
});
};
应用绑定(新的ViewModel());
然后在我的html中,我有如下模板:

var json = {
    name: 'Testing',
    items: [{
        question: 'Question 1',
        answer: '',
        isrequired: true,
        isvisible: true,
        complexObject: {
            FirstName: '',
            LastName: '',
            Email: ''
        }
    }, {
        question: 'Question 2',
        answer: '',
        isrequired: true,
        isvisible: true,
        complexObject: {
            FirstName: '',
            LastName: '',
            Email: ''
        }
    }]
};

var ViewModel = function () {
    var self = this;
    self.profile = ko.observable(new Profile(json));
};

var Profile = function (init) {
    var self = this;
    self.name = ko.observable(init.name);
    self.items = ko.observableArray([]);
    for (var i = 0; i < init.items.length; i++) {
        self.items.push(new ProfileItem(init.items[i]));
    }
};

var ComplexObject = function () {
    var self = this;
    self.name = ko.observable("");
    self.email = ko.observable("");
}

var ProfileItem = function (item) {
    var self = this;
    self.question = ko.observable(item.question);
    self.answer = ko.observable(item.answer);
    self.complexObject = ko.observable(new ComplexObject());
    self.isvisible = ko.observable(item.isvisible);
    self.isrequired = item.isrequired;
    self.cssclasses = ko.computed(function () {
        if (self.complexObject().Email != undefined && self.complexObject().Email().length > 0) {
            return "satisfied";
        } else {
            return "required";
        }
    });
};

ko.applyBindings(new ViewModel());
<div data-bind="foreach: profile().items">
    <div data-bind="css: cssclasses">
        <span data-bind="text: question"></span><br />
        <div data-bind="with: complexObject">
            <input data-bind="value: email" />
        </div>
    </div>
</div>
<div data-bind="text: ko.toJSON($root)"></div>


似乎当“Email”的值被更新时,cssclasses计算出的值永远不会重新计算。有没有办法强制重新计算

向所有人的帮助致以最良好的问候和感谢

JS小提琴:


Hal

如果在计算机中取消电子邮件的资本化,它就会工作。看


更改self.complexObject().Email!==未定义(&self.complexObject().Email().length>0)to
self.complexObject().Email!==未定义(&self.complexObject().email().length>0)
-因为这就是您在视图模型和数据绑定中使用它的方式。

我认为我们还需要查看
complexObject
的源代码。似乎输入的$data对象(来自上面的HTML)是一个ProfileItem。在上面的代码中没有可见的电子邮件。你是对的。这是我从一个更复杂的例子中翻译出来的。我将返回并检查实际代码,以确保在该区域没有大写错误。无论哪种方式,我的小提琴显然是有效的(当被改变时),所以我的问题可能是一些无关的东西,我在这里没有解释。谢谢你。@halnp-发生在我们所有人身上