TL; DR
如果在获得值后emailProfile
/ aliasProfile
被清除,如何重置email
/ alias
?
版本稍长
我的表单包含email
和alias
的输入内容。两者都不是强制性的。但是,如果您填写alias
字段,如果保留email
,则可能还需要alias
。
到目前为止,我已经从空表单设置管道,直到检查alias
是否被保留以及给定的email
是否匹配。这可以正确可靠地工作。
我的设置停滞不前,就是在填写正确的电子邮件后,我清除了email
。 emailProfile
的状态仍然是现状(上次服务器响应)。
我想要实现的目标是在emailProfile
没有值时(或实际上当email
为假时)清除validEmail
,但在所有其他情况下,返回最后一个服务器响应。
解决我能想到的问题的直接(也是唯一)方法是在验证失败时删除filter
并从查找函数返回null
,但必须有一个更好的方法,对吗?
// Functions that can be assumed to work as they should (they do):
// form.findInput, validAlias,validEmail, compose,
// fetchProfilesByAlias, fetchProfileByEmail
var alias = Bacon.fromEventTarget(form.findInput("alias"), "change").
merge(
Bacon.fromEventTarget(form.findInput("alias"), "keyup")
).
map(".target").
map(".value").
skipDuplicates().
toProperty(form.findInput("alias").value);
var email = Bacon.fromEventTarget(form.findInput("email"), "change").
merge(
Bacon.fromEventTarget(form.findInput("email"), "keyup")
).
map(".target").
map(".value").
skipDuplicates().
toProperty(form.findInput("email").value);
var aliasProfiles = alias.
debounce(600).
filter(validAlias).
flatMapLatest(compose(Bacon.fromPromise.bind(Bacon), fetchProfilesByAlias)).
toProperty(null);
var emailProfile = email.
debounce(600).
filter(validEmail).
flatMapLatest(compose(Bacon.fromPromise.bind(Bacon), fetchProfileByEmail)).
toProperty(null);
答案 0 :(得分:2)
这是我能想到的最直接的方式。
var emailProfile = email.
debounce(600).
flatMapLatest(function(email) {
if (validEmail(email)) {
return Bacon.fromPromise(fetchProfileByEmail(email))
} else {
return null
}
}).
toProperty(null)
与您已经发现的几乎相同,只是if
不在查找功能中:)