2017-05-31 3 views
0

J'utilise actuellement ZK pour le développement web. Voici mon cas:ZK Binding NotifyChange ne fonctionne pas sur événement OnChanging?

J'implémente la recherche instantanée, une fois le changement de texte => effectuer une recherche.

Zul Fichier

<textbox id="textSearch" sclass="search_text"> 
             <attribute name="onChanging">         
         lbOnChangingSearch.setValue(event.getValue()); 
              vm.onChangingTextSearch();         
             </attribute> 
            </textbox> 
            <label id="lbOnChangingSearch" visible="false"></label> 

     <grid id="gridChapter" model="@load(vm.chapterInPage)"> 
      .... 
     </grid> 

Code contrôleur

ListModelList<ChapterJoinComic> chapterInPage; 
public ListModelList<ChapterJoinComic> getChapterInPage() { 
    return chapterInPage; 
} 

@NotifyChange({ "topComics", "chapterInPage"}) 
@Command 
    public void onChangingTextSearch() { 

     FilterObject fo = getFilterObject(); 
     fo.setSearch_str(lbOnChangingSearch.getValue()); 

     // 
     doSearch(fo); // Change chapterInPage 


     // Manually post Not 
BindUtils.postNotifyChange(null,null,this.chapterInPage,"chapterInPage"); 
    } 

Problème Après appel onChangingText recherche, Grille DonT jour databinding. Mais si je continue à changer de texte (plus d'appel onChangingTextSearch). La grille sera mise à jour, mais la valeur mise à jour est la valeur précédente.

Il semble que la grille soit plus lente que mon dernier objet Modèle.

Remarque Si j'utilise onOK au lieu de l'événement onChanging, la liaison de données fonctionne correctement.

Tout le monde peut m'aider. Merci d'avance!

Répondre

1

Vous devez supprimer les BindUtils.postnotifyChange lorsque vous utilisez @NotifyChange déjà, et vous l'utilisez mal de toute façon: le troisième paramètre doit être this au lieu de this.chapterInPage. The JavaDoc explique que vous devez spécifier le bean dont la propriété est en train de changer et le nom du property.

De plus, remplacez onChanging attribut avec la bonne façon d'appeler une commande:

<textbox id="textSearch" sclass="search_text" 
     onChanging="@command('onChangingTextSearch')" /> 

Consultez the documentation pour plus d'informations sur la façon d'utiliser les commandes. Je pense que parce que vous n'utilisez pas la commande comme une commande, le @NotifyChange n'est pas déclenché. Et votre postNotifyChange est erronée, comme je l'ai dit. Faites-moi savoir si cela fonctionne ou si d'autres problèmes subsistent.


EDIT

Je viens recréés un exemple moi-même, et il semble fonctionner. Essayez comme ceci:

ViewModel -------------------------------- 

    private String searchText = ""; 

    @NotifyChange({"chapterInPage", "searchText"}) 
    @Command 
    public void onChangingTextSearch(@BindingParam("text") String searchText) 
    { 
     this.searchText = searchText; 
    } 

    public String getSearchText() 
    { 
     return searchText; 
    } 

    public ListModelList<String> getChapterInPage() 
    { 
     return new ListModelList<>(searchText.split("")); 
    } 

zul -------------------------------------- 

    <textbox onChanging="@command('onChangingTextSearch', text=event.value)" /> 

    <label id="lbl" value="@load(model.searchText)" /> 

    <listbox model="@load(model.chapterInPage)" /> 

Notez que j'utilise la commande de liaison pour appeler la méthode de recherche dans le modèle au lieu d'appeler « manuellement » dans un auditeur OnChanging. De cette façon, je l'exécute en tant que commande, ce qui déclenche le notifyChange. Lorsque vous l'appelez comme vm.onChangingTextSearch() dans un écouteur, le @NotifyChange est ignoré. De cette façon, cela fonctionne comme prévu, et avec chaque caractère tapé (enfin, après quelques millisecondes de retard), la liste est mise à jour. Un autre avantage est que vous n'avez pas à lier votre étiquette dans le modèle de vue, ce que la documentation de zk décourage.

Pouvez-vous essayer de relier votre zul et le modèle comme celui-ci et dites-moi si cela fonctionne.Si ce n'est pas le cas, vous pouvez essayer de créer un exemple sur zkFiddle qui reproduit le comportement de votre code.

+0

Bonjour je vous remercie beaucoup pour votre soutien. Mais même j'ai essayé de remplacer "this.chapterInPage" par "this", ça ne marche pas. La grille ne rafraîchit pas les données de liaison après ces appels (@NotifyChange toujours là) – Ronaldinho

+0

Je veux noter que, sur l'événement onOK, la grille rafraîchit bien, mais onChanging semble ne pas fonctionner, je ne comprends pas pourquoi – Ronaldinho

+0

@Ronaldinho J'ai ajouté un exemple qui fonctionne pour moi. Jetez un coup d'oeil et essayez de changer votre code pour travailler comme ça. –

1

En plus de Malte sa réponse. La zone de texte envoie uniquement des données au serveur avec l'événement onChange pour éviter le trafic réseau inutile.


Si vous souhaitez envoyer des données au serveur avec l'événement onChanging, vous devez faire:

<textbox instant="true" /> 

Dans ce cas, le client sera mis à jour presque instantanément au serveur (si vous tapez vite, il sera quand vous arrêtez de taper)

+0

Etes-vous sûr de ne pas mélanger les choses? Dans mon expérience, textbox par défaut envoie 'onChanging' comme vous l'expliquez. Le JavaDoc sur 'setInstant' dit qu'il envoie' onChange' comme ça aussi, quand vous le mettez 'true'. –

+0

Je sais maintenant ce que vous voulez dire et quand vous avez besoin de 'instant': Lorsque vous utilisez la liaison de données au lieu d'écouteurs d'événements, vous vous liez à' value'. Afin de déclencher la fonction de sauvegarde 'onChanging ', vous devez alors mettre' instant' à 'true'. –

+0

Je ne vais pas discuter, sauf dans une conversation. C'est un essai facile et nous verrons ce qu'il fait. Normalement, vous utilisez 'onChanging' avec' instant' à true, sinon vous devez utiliser l'événement 'onChange'. – chillworld