无法评估淘汰计算机功能

时间:2016-08-25 13:25:30

标签: javascript knockout.js knockout-validation

请在这里查看我的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)时,它打印出一个函数。所以这是一个功能。 我该如何使用呢?我希望它返回一个整数。目前它返回一个函数,但我不允许对它进行评估。

知道发生了什么事吗?

更新

有些人因为某些奇怪的原因而一直看到旧版的傻瓜。

我现在可以看到它是一个声明订单问题。 如果我这样做:

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

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

如果我做相反的事情,那么这个功能就不存在了。

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

2 个答案:

答案 0 :(得分:1)

刚刚将此行添加到EmailsSubscribers

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

检查此更新后的工作Plunkr

答案 1 :(得分:1)

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

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