Ответ Кнута правильный. Мой ответ показывает, почему, и дает подход к hide-whens, который почти всегда делает их более легкими для выяснения.
Notes использует формулы «спрятать-когда» навсегда, но люди действительно склонны думать с точки зрения зрения, когда в их требованиях! Мы знаем, когда хотим видеть вещи (когда в этом случае мы наблюдатели или админы). И нам очень плохо, когда мы обращаем внимание на то, что нужно, чтобы спрятать эти формулы, потому что мы действительно плохо помним DeMorgan's Law, в котором говорится о таких вещах, как:^(P & Q) == (^ P |^Q)
Так что, если мы сформулируем требование так:
Hide when the user isn't a Supervisor or an Admin
мы склонны иметь проблемы с включением его в правильную формулу с двумя @IsNotMember вызовы (которые неявно логические неимущими), потому что мы забываем, что Ors должны повернуть в Ands, чтобы все было правильно. Но если мы думаем об этом так:
See when the user is an Admin or the user is an Supervisor
Это легко увидеть, как выразить это:
@IsMember("[Supervisor]"; @UserRoles) | @IsMember("[Admin]"; @UserRoles);
Или, используя силу списков формула языка, мы можем сократить, что это:
@IsMember("[Supervisor]": "[Admin]" ; @UserRoles);
чтобы превратить это в эквивалентные прятки, когда все, что вам нужно сделать, это положить логичное Не вокруг него, как это:
! (@IsMember("[Supervisor]": "[Admin]" ; @UserRoles));
Вы можете сделать это с помощью любой формулы see-when - просто округлите ее круглыми скобками и положите! перед ним, но в специальном случае формулы, которая просто использует @IsMember, вы можете просто изменить ее на @IsNotMember, которая возвращает ее в решение Кнута.
Gotta love that elementary logic :-) –
Сокращенная версия, которую я нахожу проще: ! (@ Userroles = "[Admin]": "[Supervisor]"); - the!превращает hide-when в show-when (проще думать, как говорит Ричард) - «=» пробегает все комбинации списка @userroles и список, с которым сравнивается, поэтому, если у пользователя есть Admin или Supervisor , они будут видеть кнопку. – user2808054