Используйте функцию callback()
внутри успеха foo()
. Попробуйте таким образом. Это просто и легко понять. & nbsp;
var lat = "";
var lon = "";
function callback(data) {
lat = data.lat;
lon = data.lon;
}
function getLoc() {
var url = "http://ip-api.com/json"
$.getJSON(url, function(data) {
callback(data);
});
}
getLoc();
Вам просто нужно реализовать интерфейс Validator
.
@FacesValidator("myValidator")
public class MyValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// ...
if (valueIsInvalid) {
throw new ValidatorException(new FacesMessage("Value is invalid!"));
}
}
}
@FacesValidator
зарегистрирует его в JSF с идентификатором проверки подлинности myValidator
, чтобы вы могли ссылаться на него в атрибуте validator
для любого компонента <h:inputXxx>
/ <h:selectXxx>
следующим образом:
<h:inputText id="foo" value="#{bean.foo}" validator="myValidator" />
<h:message for="foo" />
Вы также можете использовать <f:validator>
, что было бы единственным если вы намерены присоединить несколько валидаторов к одному и тому же компоненту:
<h:inputText id="foo" value="#{bean.foo}">
<f:validator validatorId="myValidator" />
</h:inputText>
<h:message for="foo" />
Всякий раз, когда валидатор выдает ValidatorException
, его сообщение будет отображаться в поле <h:message>
, связанное с полем ввода.
Вы можете использовать <f:validator binding>
для ссылки на конкретный экземпляр валидатора где-то в области EL, который, в свою очередь, может быть легко предоставлен в виде лямбда:
<h:inputText id="foo" value="#{bean.foo}">
<f:validator binding="#{bean.validator}" />
</h:inputText>
<h:message for="foo" />
public Validator getValidator() {
return (context, component, value) -> {
// ...
if (valueIsInvalid) {
throw new ValidatorException(new FacesMessage("Value is invalid!"));
}
};
}
Чтобы получить еще один шаг, вы можете использовать проверку компонентов JSR303. Это проверяет поля на основе аннотаций. Поскольку это будет целая история, вот только некоторые ссылки для начала:
<f:validateBean>
полезна только в том случае, если вы намерены отключить проверку компонентов JSR303. Затем вы помещаете входные компоненты (или даже всю форму) внутри <f:validateBean disabled="true">
.