【问题标题】:Knockout computer function cannot be evaluated敲除计算机功能无法评估
【发布时间】:2017-01-01 23:08:44
【问题描述】:

请在此处查看我的 plunkr:

https://plnkr.co/edit/pwKohFTmLPW1BKNwHxWR?p=preview

我有一个简单的电脑功能:

self.SubscribersOrEmails = ko.computed(function() {
    var counter = 0;
    if (self.Emails != null && self.Subscribers != null) {
        counter = self.Emails().length + self.Subscribers().length;
    }
    console.log("counter: " + counter);
    return counter;
}, self);

当我像这样使用它时: self.SubscribersOrEmails() 然后我得到'SubscribersOrEmails is not a function' 的错误 但是当我做console.log(self.SubscribersOrEmails) 时,它会打印出一个函数。所以它是一个函数。 那我该怎么用呢?我希望它返回一个整数。目前它返回一个函数,但我不能评估它。

知道这是怎么回事吗?

更新

有些人出于某种奇怪的原因看到了旧版本的 plunkr。

我现在可以看到这是一个申报顺序问题。 如果我这样做:

self.SubscribersOrEmails = ko.computed(function() {
              var counter = 0;
                if (self.Emails != null && self.Subscribers != null) {
                    counter = self.Emails().length + self.Subscribers().length;
                }
            console.log("counter: " + counter);
            return counter;
        }, self); 

 self.Subscribers = ko.observableArray().extend({ required: { onlyIf: function () { console.log(self.SubscribersOrEmails()); return self.SubscribersOrEmails === 0}, params: 'Subscribers', message: "Please either select a user or type email address(es)" } })
 self.Emails = ko.observableArray().extend({ required: { onlyIf: function () { return self.SubscribersOrEmails == 0 }, params: 'Emails' } })

然后该功能有效,但电子邮件和订阅者始终为零,因为它们在读取时不存在。

如果我反其道而行之,则该功能不存在。

所以所有可能的订单声明都会导致问题:(

【问题讨论】:

  • 这是因为您的申报顺序。在extend 方法中,您指的是尚未声明的方法。您可以通过在声明该计算属性后扩展这些可观察对象来解决此问题。
  • 我不能这样做,因为那样 Emails() 和 Subscribers() 将不存在!这是第 22 条问题。要么方法不存在,要么 observableArrays 不存在。没有正确的声明顺序。下一步是什么?
  • 您可以在声明后扩展可观察对象。所以,首先,你声明EmailsSubscribers,类似于self.Email = ko.observableArray(); 然后你声明你的计算。现在所有属性都存在,扩展您的可观察数组,self.Email.extend(...

标签: javascript knockout.js knockout-validation


【解决方案1】:

这是因为您的声明顺序。在extend 方法中,您指的是尚未声明的方法。您可以通过在声明该计算属性后扩展这些可观察对象来解决此问题。

self.Subscribers = ko.observableArray();
self.Emails = ko.observableArray();
self.SubscribersOrEmails = ko.computed(function() {
    var counter = 0;
    if (self.Emails != null && self.Subscribers != null) {
        counter = self.Emails().length + self.Subscribers().length;
    }
    console.log("counter: " + counter);
    return counter;
}, self); 

self.Subscribers.extend({ required: { onlyIf: function () { return self.SubscribersOrEmails == 0 }, params: 'Subscribers', message: "Please either select a user or type email address(es)" } })
self.Emails.extend({ required: { onlyIf: function () { return self.SubscribersOrEmails == 0 }, params: 'Emails' } })

【讨论】:

    【解决方案2】:

    刚刚将此行添加到EmailsSubscribers

    onlyIf: function() {
        return self.SubscribersOrEmails && self.SubscribersOrEmails() === 0;
    }
    

    检查这个更新的工作Plunkr

    【讨论】:

    • 不,你们为什么会看到旧版本?请尝试刷新您的屏幕。我现在按了“冻结”,不确定它的作用,但也许它会帮助更新它
    • 是的,你的 plunkr 不起作用。它解决了我自己已经解决的问题。试试我的新 plunkr
    • 你是对的。这也有效。感谢那。我仍然会保留 Carrie 的答案作为已接受的答案,因为它解决了申报顺序的谜团
    猜你喜欢
    • 2014-10-18
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多