Откуда взялось «Нет»?
blockquote>Функция.
И что это такое?
blockquote>Это то, что возвращала функция.
В Python каждая функция возвращает что-то. Он может «быть несколькими вещами», используя кортеж, или он может «быть ничем», используя
None
, но он должен что-то вернуть. Вот как мы имеем дело с тем, что не существует способа указать тип возврата (что не имеет смысла, поскольку вы не указываете типы для чего-либо еще). Когда интерпретируется как строка для печати,None
заменяется строкой «Нет».
None
- это особый объект, который должен представлять отсутствие какой-либо реальной вещи. Его типNoneType
(это экземпляр этого класса). Всякий раз, когда вы явно ничего не возвращаете, вы неявно возвращаете None.Вы написали функцию для печати одного из двух значений
x
илиy
, но ничего не возвращали. Итак,None
был возвращен. Затем вы попросили Python распечатать результат вызова функции. Поэтому он назвал функцию (печать одного из значений), а затем напечатал возвращаемое значение, которое былоNone
, как текст «Нет».
Вы столкнулись с этой проблемой, потому что у вас есть дважды id="first"
. Исправьте это, и он должен работать.
Поместите компонент в область видимости и избавьтесь от любой бизнес-логики в методах getter.
Компонент должен быть помещен в область представления, чтобы все предыдущие выборы и новые доступные элементы были запомнены, в противном случае что-то не удастся, если, например, rendered
атрибут зависит от условия, которое было задано только в предыдущем запросе, или если JSF должен проверить выбранный элемент по списку доступных элементов.
Методы getter не должны содержать никакой бизнес-логики, поскольку они также будет использоваться во время ao фаза проверки. Вы должны использовать <f:ajax listener>
для выполнения бизнес-логики на основе изменения. Вы должны в методе слушателя также явно очистить выбранные значения дочерних выпадающих списков. Вы можете использовать <f:ajax render>
для обновления содержимого дочерних выпадающих списков.
Таким образом, так:
<h:selectOneMenu id="state" value="#{nodes.selectedState}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableStates}" />
<f:ajax listener="#{nodes.changeState}" render="city region station" />
</h:selectOneMenu>
<h:selectOneMenu id="city" value="#{nodes.selectedCity}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableCities}" />
<f:ajax listener="#{nodes.changeCity}" render="region station" />
</h:selectOneMenu>
<h:selectOneMenu id="region" value="#{nodes.selectedRegion}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableRegions}" />
<f:ajax listener="#{nodes.changeRegion}" render="station" />
</h:selectOneMenu>
<h:selectOneMenu id="station" value="#{nodes.selectedStation}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableStations}" />
</h:selectOneMenu>
с
@ManagedBean
@ViewScoped
public class Nodes {
private String selectedState; // getter+setter
private String selectedCity; // getter+setter
private String selectedRegion; // getter+setter
private String selectedStation; // getter+setter
private List<SelectItem> availableStates; // getter (no setter necessary!)
private List<SelectItem> availableCities; // getter (no setter necessary!)
private List<SelectItem> availableRegions; // getter (no setter necessary!)
private List<SelectItem> availableStations; // getter (no setter necessary!)
@EJB
private SomeService someService;
@PostConstruct
public void init() {
availableStates = someService.listStates();
}
public void changeState(AjaxBehaviorEvent event) {
availableCities = someService.listCities(selectedState);
selectedCity = selectedRegion = selectedStation = null;
availableRegions = availableStations = null;
}
public void changeCity(AjaxBehaviorEvent event) {
availableRegions = someService.listRegions(selectedCity);
selectedRegion = selectedStation = null;
availableStations = null;
}
public void changeRegion(AjaxBehaviorEvent event) {
availableStations = someService.listStations(selectedRegion);
selectedStation = null;
}
// Generate necessary getters+setters here. You should not change them.
}
Попробуйте это, это может помочь вам
С помощью --Select City--, --Выберите Region--, --Select Station--, чтобы избежать исключения нулевого указателя.
public getStateList(){
stateList= new ArrayList<SelectItem>();
stateList.add(new SelectItem("A"));
}
public getCityList(){
CityList= new ArrayList<SelectItem>();
if(selectState.equals("A"))
{
CityList.add(new SelectItem("B"));
}
else
{
CityList.add(new SelectItem("--Select City--"));
selectCity = "--Select City--";
}
public getRegionList(){
RegionList= new ArrayList<SelectItem>();
if(selectCity.equals("B"))
{
RegionList.add(new SelectItem("C"));
}
else
{
RegionList.add(new SelectItem("--Select Region--"));
selectRegion = "--Select Region--";
}
}
public getStationList(){
StationList= new ArrayList<SelectItem>();
if(selectRegion.equals("C"))
{
StationList.add(new SelectItem("D"));
}
else
{
StationList.add(new SelectItem("Select Station"));
selectStation = "--Select Station--";
}
}