2015-06-26 14 views
1

Недавно я взял Bacon.js и сделал с ним некоторый пользовательский интерфейс, в котором я включаю только кнопку «Зарегистрироваться», если требования met, один из них проверяет правильность имени пользователя.Bacon.js объединяет свойства с .and() только в том случае, если prop === true

// 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

Проблема была в том, что ваше правдивое значение включает как действительные, так и недействительные случаи. Эта функция никогда не возвращает значения фальши. Как насчет разделения недействительных и достоверных значений правды и ложности?

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; 
}); 

Затем, без существенного изменения исходного кода

password.and(username).and(isUsernameInvalid.not()) 
    .not().assign($(view['signup-submit']), 'toggleClass', 'disabled'); 
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') 

Лучше держать каждую функцию малого и отделить проблемы.

+0

Спасибо за предложение, но я в конечном итоге изменить свою функцию, чтобы возвращать либо Bacon.Next или Bacon.Error и преобразование собственности, основанной на что. – Mario