只有当prop === true时,Bacon.js才会将属性与.and()结合起来

时间:2015-06-26 06:25:14

标签: javascript frp bacon.js

我最近选择了Bacon.js并用它做了一些用户界面,如果满足要求,我只启用“注册”按钮,其中一个检查用户名是否有效。

// Returns true or string with invalid reason
var isUsernameValid = username
    .map(function(value) {
        if(value.length < 4) {
            return 'Must be 4 characters at least';
        }

        if(!config.patterns['username'].test(value)) {
            return 'Can only have letters, numbers, periods, or underscores';
        }

        return true;
    });

它返回true或用户名无效的原因。

稍后我将所有结果与此结合起来:

password.and(username).and(isUsernameValid)
    .not().assign($(view['signup-submit']), 'toggleClass', 'disabled');

用户名和密码仅在输入时才为真,但由于isUsernameValid始终返回 truthy 值,因此按钮最终会被错误地启用。

有没有更好的方法通过传递函数来返回错误或组合属性?

我想要声明另一个流/属性,如果value === true返回,但我试图避免这种情况。

2 个答案:

答案 0 :(得分:0)

我会这样做:

var isUsernameLongEnough = username.map(function(value) {
  return value.length >= 4
})
var usernameHasCorrectCharacters = username.map(function(value) {
  return config.patterns['username'].test(value)
})

var isUsernameValid = isUsernameLongEnough.and(usernameHasCorrectCharacters)

password.and(username).and(isUsernameValid)
    .not().assign($(view['signup-submit']), 'toggleClass', 'disabled')

isUsernameLongEnough.not().assign($(view['error-too-short']), 'toggle')
usernameHasCorrectCharacters.not().assign($(view['error-invalid-characters']), 'toggle')

最好保持每个功能较小并将问题分开。

答案 1 :(得分:0)

问题是因为您的真实价值包括有效和无效的案件。该函数永远不会返回虚假值。如何将无效和有效分隔成真值和假值?

[HttpGet]
        public JsonResult FillCourseInfo(int StudentID, int CourseID)
        {
            var ret = (from e in db.Enrollments 
                       join c in db.Courses on e.CourseID equals c.CourseID
                       where e.StudentID == StudentID && e.CourseID == CourseID
                       select new
                       {
                           courseStartDate = c.CourseStartDate,
                           courseEndDate = c.CourseEndDate,
                           projectName = e.Project.ProjectTitle,
                           graduated = e.Graduated

                       }).ToList()
                       .Select(a => new StudentCourseDetails() {
                           courseStartDate = a.courseStartDate.ToString("MMM d, yyyy"),
                           courseEndDate = a.courseEndDate.ToString("MMM d, yyyy"),
                           projectName = a.projectName,
                           graduated = a.graduated.Value.ToString()
                       }).FirstOrDefault();
            string sd = ret.courseStartDate;
            string ed = ret.courseEndDate;
            string pn = ret.projectName;
            string g = ret.graduated;
            return Json(ret, JsonRequestBehavior.AllowGet);
        }

然后,对原始代码没有太大的改动

var isUsernameInvalid = username
  .map(function(value) {
    if(value.length < 4) {
      return 'Must be 4 characters at least';
    }

    if(!config.patterns['username'].test(value)) {
      return 'Can only have letters, numbers, periods, or underscores';
    }

    return false;
});