2016-11-25 3 views
0

Я использую NativeScript Angular2, и на моей странице я добавил ListPicker для выбора пользователем. Ниже приведен фрагмент кода для HTML файла:NativeScript Angular2 - ListPicker не работает на Android

<ListPicker #languagePicker id="languagePicker" [visibility]="langSelectStatus()" [items]="languages" class="mek-select-field" (selectedIndexChange)="selectedIndexChanged(languagePicker)" 
> 
</ListPicker> 

Ниже приводится CSS:

.mek-select-field { 
    height: 70px; 
    border-color: lightblue; 
    border-width: 1px; 
    margin: 0; 
} 

Я нашел код работает без каких-либо проблем на IOS, следующий скриншот: ListPicker on iOS

Однако на Android обнаружено, что ListPicker не работает. Он отображает список, но не может прокручиваться между определенными параметрами. Ниже приведен скриншот: ListPicker on Android

Ниже приводится информация среда:

  • NativeScript версия: 2.4.0
  • NativeScript-Угловая версия: 1.1.3
  • NativeScript Android Продолжительность версии: 2.4.1
  • Android эмулятор: API 25 Nexus 6

Я новичок в NativeScript и не уверен, связано ли это с моей средой или нет.

Любые советы будут очень желанными. Заранее спасибо

[Обновлен 2016 26 Ной]: Исследуя образец, как советовал Нико и больше испытаний, я обнаружил, что поведение появляется только тогда, когда значение параметра является выборками из бекенда через Http службу. Например, в примере по создавшему-listpicker.component.ts класса, если изменить список опций для извлечения из Http бэкэнда, как показано ниже кода:

export class CreatingListPickerComponent { 

    public pokemons: Array<string>; 
    public picked: string; 

    constructor(private http: Http) { 
     this.pokemons = []; 

     this.http.get('http://192.168.31.120:3000/pokemons').subscribe(
      res => { 
       let list = res.json(); 
       console.log(`Pokemon list: ${list}`); 
       for (var i = 0; i < list.length; i++) { 
        this.pokemons.push(pokemonList[i]); 
       }   
      } 
     ); 

/*  for (var i = 0; i < pokemonList.length; i++) { 
      this.pokemons.push(pokemonList[i]); 
     }*/ 
    } 

    public selectedIndexChanged(picker) { 
     console.log('picker selection: ' + picker.selectedIndex); 
     this.picked = this.pokemons[picker.selectedIndex]; 
    } 
} 

Где конечная точка будет ответ с точно таким же значением, что и жёстко стоимость. Когда я запускаю вышеуказанный код в Android (как эмулятор, так и устройство), я обнаружил, что ListPicker не сможет время от времени показывать какие-либо параметры (или только первый). Это очень легко переделать. У iOS нет этой проблемы.

Я считаю, что существуют некоторые проблемы, когда параметры ListPicker исходят из бэкэнда Http, где присутствует некоторая задержка.

Пожалуйста, советы Кларенс

+0

Найдено больше информации.В ListPicker «элементы» поступают для вызова API службы Http, который я вызываю в http в ngOnInit(), а затем заполняю переменную «Языки», когда результат возвращается из бэкэнд. Похоже, что на Android, когда элементы были заполнены позже, ListPicker не обновляется. Хотя в iOS эта проблема не найдена. –

+0

Привет @ Кларенс. Хорошей отправной точкой является просмотр этого примера проекта - https://github.com/NativeScript/nativescript-sdk-examples-ng, где показано, как использовать все компоненты NativeScript в проекте NativeScript Angular 2 , Именно для вашего случая вы можете рассмотреть пример здесь: https://github.com/NativeScript/nativescript-sdk-examples-ng/tree/master/app/ui-category/listpicker/creating-listpicker. –

+0

Привет @Nikolay, большое спасибо за ваш ответ. Я проверил в примере кода и добавил дополнительную информацию в свой пост для справки. большое спасибо. –

ответ

0

Чтобы иметь возможность добавлять ListPicker пунктов после HTTP запроса необходимо создать новый массив после получения данных и сделать старый массив, чтобы указать на новый. Вы можете просмотреть приведенный ниже образец.

HTML

<FlexboxLayout flexDirection="column" exampleTitle toggleNavButton> 
     <Label class="h3 p-15 text-left" text="Pick a pokemon" textWrap="true"></Label> 
     <!-- >> creating-listpicker-html --> 
     <ListPicker #picker id="pickerid" class="p-15" 
         [items]="pokemons" 
         [selectedIndex]="selectedIndex" 
         (selectedIndexChange)="selectedIndexChanged(picker)"> 
     </ListPicker> 
     <!-- << creating-listpicker-html --> 
     <Label [text]="'Selected pokemon: ' + picked" class="p-15" textWrap="true"></Label> 
</FlexboxLayout> 

машинопись

import { Component , NgZone} from "@angular/core"; 
import { getFile, getImage, getJSON, getString, request } from "http"; 

var pokemonList = ["Bulbasaur", "Parasect", "Venonat", "Venomoth", "Diglett", 
"Dugtrio", "Meowth", "Persian", "Psyduck", "Arcanine", "Poliwrath", "Machoke"]; 

@Component({ 
    selector: "creating-listpicker", 
    templateUrl: "ui-category/listpicker/creating-listpicker/creating-listpicker.component.html" 
}) 
export class CreatingListPickerComponent { 

    public pokemons: Array<string>; 
    public picked: string; 

    constructor(private zone:NgZone) { 
     this.pokemons = []; 
    } 
    ngOnInit(){ 
     var that =this; 
     getJSON("https://httpbin.org/get?item1=item1&item2=item2&item3=item3") 
      .then((r) => { 
        console.log((<any>r).args.item1); 
        let args = (<any>r).args; 
        var arr = [args.item1, args.item2, args.item3] 
        this.pokemons = arr; 
      }, (e) => { 
       alert("GetJSON: " + e) 
      }); 
    } 

    public selectedIndexChanged(picker) { 
     console.log('picker selection: ' + picker.selectedIndex); 
     this.picked = this.pokemons[picker.selectedIndex]; 
    } 
} 
Смежные вопросы