javascript - 无法评估 knockout 计算机功能

标签 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 不是函数' 但是当我执行 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' } })

然后该函数可以工作,但电子邮件和订阅者始终为零,因为它们在读取时不存在。

如果我执行相反的操作,则该函数不存在。

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

最佳答案

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

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

关于javascript - 无法评估 knockout 计算机功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39146611/

相关文章:

javascript - knockout 验证自定义规则不起作用

javascript - knockout validation : how to validate the fields on button click, 不在输入更改时

javascript - 命名空间模式导致 JSLint 'function was used before it' s defined' 错误

jquery - 嵌套 knockout foreach 模板

javascript - 如何使正则表达式仅匹配每个匹配项的第一次出现?

javascript - 有什么办法可以在 jquery 中附加更多数据吗?

javascript - Knockoutjs 绑定(bind)没有改变

knockout.js - knockout validation 未清除错误模板

c# - 如何在 C# ASP.Net 中获取 jQuery 自动完成 "tagify"值

javascript - 在 mousemove() 上围绕中心移动的 Div