我最近选择了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
返回,但我试图避免这种情况。
答案 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;
});