敲除电脑功能无法评估
Knockout computer function cannot be evaluated
请在这里查看我的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)
时,它会打印出一个函数。所以它是一个函数。
那我该如何使用呢?我想要它 return 一个整数。目前它 return 是一个函数,但不允许我对其求值。
知道这是怎么回事吗?
更新
有些人出于某种奇怪的原因看到了旧版本的 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' } })
然后该函数可以运行,但电子邮件和订阅者始终为零,因为它们在读取时不存在。
如果我反其道而行之,那么函数就不存在了。
所以所有可能的订单声明都会导致问题:(
刚刚将此行添加到 Emails
和 Subscribers
onlyIf: function() {
return self.SubscribersOrEmails && self.SubscribersOrEmails() === 0;
}
检查这个更新的工作 Plunkr
这是因为您的申报顺序。在 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' } })
请在这里查看我的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)
时,它会打印出一个函数。所以它是一个函数。
那我该如何使用呢?我想要它 return 一个整数。目前它 return 是一个函数,但不允许我对其求值。
知道这是怎么回事吗?
更新
有些人出于某种奇怪的原因看到了旧版本的 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' } })
然后该函数可以运行,但电子邮件和订阅者始终为零,因为它们在读取时不存在。
如果我反其道而行之,那么函数就不存在了。
所以所有可能的订单声明都会导致问题:(
刚刚将此行添加到 Emails
和 Subscribers
onlyIf: function() {
return self.SubscribersOrEmails && self.SubscribersOrEmails() === 0;
}
检查这个更新的工作 Plunkr
这是因为您的申报顺序。在 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' } })