在值上重置培根属性已更改为空

时间:2014-08-16 08:39:49

标签: bacon.js

TL; DR

如果在获得值后emailProfile / aliasProfile被清除,如何重置email / alias

版本稍长

我的表单包含emailalias的输入内容。两者都不是强制性的。但是,如果您填写alias字段,如果保留email,则可能还需要alias

到目前为止,我已经从空表单设置管道,直到检查alias是否被保留以及给定的email是否匹配。这可以正确可靠地工作。

我的设置停滞不前,就是在填写正确的电子邮件后,我清除了emailemailProfile的状态仍然是现状(上次服务器响应)。

我想要实现的目标是在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);

1 个答案:

答案 0 :(得分:2)

这是我能想到的最直接的方式。

var emailProfile = email.
  debounce(600).
  flatMapLatest(function(email) {
    if (validEmail(email)) {
      return Bacon.fromPromise(fetchProfileByEmail(email))
    } else {
      return null
    }
  }).
  toProperty(null)

与您已经发现的几乎相同,只是if不在查找功能中:)