【问题标题】:Knockout js css doesn't seem to recalculate when child observable is updated更新子可观察对象时,淘汰赛 js css 似乎没有重新计算
【发布时间】:2014-02-04 09:41:28
【问题描述】:

我对 Knockout 还很陌生,并试图了解 observables 和计算 observables。

更新:JS Fiddle:http://jsfiddle.net/tQ576/4/ 带有运行但损坏的示例。在输入框中输入内容时,标签应变为绿色。

我有一个这样的模型:

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());

然后在我的 html 中我有这样的模板:

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

似乎当为“电子邮件”更新值时,cssclasses 计算值永远不会重新计算。有没有办法强制重新计算?

最好的问候和感谢大家的帮助。

JS 小提琴:http://jsfiddle.net/tQ576/4/

哈尔

【问题讨论】:

  • 我想我们还需要查看ComplexObject的来源。
  • 看来输入的 $data 对象(来自上面的 HTML)是一个 ProfileItem。在上面的代码中没有可观察到的电子邮件。

标签: javascript css knockout.js


【解决方案1】:

如果您在计算中取消大写 email,它会起作用。见fiddle

将 self.complexObject().Email !== undefined &amp;&amp; self.complexObject().Email().length &gt; 0) 更改为 self.complexObject().email !== undefined &amp;&amp; self.complexObject().email().length &gt; 0) - 因为这就是您在视图模型和数据绑定中拥有它的方式。

【讨论】:

  • 你是对的。这是我从我正在研究的一个更复杂的例子中翻译出来的。我将返回并检查实际代码,以确保我在该区域没有大写错误。无论哪种方式,我的小提琴显然确实有效(改变时),所以我的问题可能是无关的,我在这里不考虑。谢谢。
  • @Hal Np - 发生在我们所有人身上
猜你喜欢
  • 1970-01-01
  • 2015-01-25
  • 2023-03-20
  • 1970-01-01
  • 2021-09-19
  • 2023-03-12
  • 1970-01-01
  • 2012-07-31
  • 2013-05-01
相关资源
最近更新 更多