2012-12-19 1 views
5

私はZKOSS MVVMを使用しています。 ビューでは、リストボックスを使用していて、ViewModelのリストモデルオブジェクトにバインドされています(@load)。私はモデルzkoss MVVMがリロードするモデル力グリッドに変更する

1を変更した場合、私は、ドキュメントから理解何

:インデックス0

I should see the latest object be appended at top of the Listbox. 

2でビューモデルからリストモデルにオブジェクトを追加します:モデル

からアイテムを削除します
I should see that particular row from Listbox be removed. 

注:ソーシャルネットワークのようなインターフェースです。誰かが投稿を作成し、新しい投稿が投稿一覧に追加されたときのFacebookの壁。投稿が削除された場合、その投稿のみがリストから削除されます。

よく追加されたり削除されたり。

なぜですか?リストボックスがリストモデルの変更に完全にリロードされる理由

ここで

は、コードスニペットがある(ユースケース:新しい投稿を追加適用される新しいポスト全体のリストボックスを作成するには、すべての時間をリロードします。):

ビュー

<z:div style="height: 100%; padding: 0px; margin: 0px;" apply="org.zkoss.bind.BindComposer" 
    viewModel="@id('want_vm') @init('want.WantDesktopVM')"> 
<z:div zclass="content"> 
    <g:render template="../css/list/noEffectList"></g:render> 
    <z:div hflex="1" width="100%" visible="@load(want_vm.toggleInput)" style="margin-bottom: 5px; padding: 5px"> 
     <z:vbox> 
      <z:textbox id="postInput" multiline="true" value="" width="690px" height="50px"/> 
      <z:div hflex="1" width="100%" style="text-align: right; padding-right: 5px"> 
       <z:button label="Post" zclass="button rect theme" onClick="@command('post', text=postInput.value)"/> 
      </z:div> 
     </z:vbox>   
    </z:div> 
    <z:listbox model="@load(want_vm.posts)" emptyMessage="No new posts found." style="border:none;"> 
     <z:template name="model" var="iwant"> 
      <listitem style="margin-top: 10px"> 
       <listcell> 
        <hbox hflex="true"> 
         <div zclass="dpFrame small"> 
          <image height="50px" width="50px" content="@load(iwant.from) @converter('converter.UserActorDisplayPicConverter')" /> 
         </div> 
         <vbox hflex="true" zclass="post"> 
          <hbox hflex="true"> 
           <label value="@load(iwant.from) @converter('converter.ActorDisplayNameConverter')" zclass="displayName"/> 
          </hbox> 
          <hbox hflex="true"> 
           <label value="@load(iwant.textData)" zclass="post_data" multiline="true" maxlength="25"/> 
          </hbox> 
          <hbox> 
           <label value="@load(iwant.dateCreated) @converter('converter.SinceDateConverter')" zclass="since"/> 
          </hbox> 
         </vbox> 
        </hbox> 
       </listcell> 
      </listitem> 
     </z:template> 
    </z:listbox> 
</z:div> 

のViewModel

class WantDesktopVM { 
UserActorManagerService userActorManagerService 
ActivityManagerService activityManagerService 

UserActor me 
UserActor profile 

String error = null 
String view = 'iwant' 

@Wire 
Textbox postInput 

private List<Activity> posts = [] 

@Init 
public void init(@ContextParam(ContextType.COMPONENT) Component component, 
@ContextParam(ContextType.VIEW) Component view) { 
    profile = Executions.current.getAttribute("profile") 
    me = Executions.current.getAttribute("me") 
    loadPosts() 
} 

@AfterCompose 
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) { 
    Selectors.wireComponents(view, this, false); 
} 

public boolean isMyProfile() { 
    return me.id == profile.id 
} 

public UserActor getMe() { 
    return this.me 
} 

public boolean isToggleInput() { 
    return this.view == 'iwant' && isMyProfile() 
} 

public List<Activity> getPosts() { 
    println "Getting posts ...${posts.size()}" 
    return this.posts 
} 

private List<Activity> loadPosts() { 
    if(view == 'iwant') { 
     posts = Activity.createCriteria().list() { 
      eq 'from', profile 
      eq 'type', ACTIVITY_TYPE.WANT 
      order("lastUpdated", "desc") 
     } 
    } else { 
     posts = ActorActivitySpace.createCriteria().list() { 
      projections {property("activity")} 
      eq 'actor', profile 
      activity { 
       ne 'from', profile 
       eq 'type', ACTIVITY_TYPE.WANT 
      } 
      order("lastUpdated", "desc") 
     } 
    } 
    return posts 
} 

@NotifyChange(['posts', 'toggleInput']) 
@Command 
public void render(@BindingParam('view') String view) { 
    println "Changing view ..." 
    this.view = view 
    loadPosts() 
} 

@NotifyChange('posts') 
@Command 
public void post(@BindingParam('text') String text) { 
    println "Posting text: $text" 
    postInput.setValue("") 
    if(text) { 
     Activity want = activityManagerService.want(me.id, text) 
     println"Want ID : $want.id" 
     posts.addAll(0, [want]) 
    } 
} 

}

+0

常にコードを入力してください。異なる動作を引き起こすコンポーネントを追加/削除するには、さまざまな方法があります。 –

+0

投稿をコードスニペットで更新しました。どうぞご覧ください –

+0

'Activity.createCriteria()。list()'のどのリストが返されますか?このリストをグリッドに接続する場所はどこですか? –

答えて

5

@NotifyChange('posts')を使用して、ZKにリスト全体が変更されたことを伝えます。グリッドはリストを調べることを試みません、単に現在のListModelを新しいリスト - >完全なリロードに置き換えます。

グリッドが使用する方法を使用する必要がある場合は、グリッドで使用される方法を使用してuiを更新する必要があります。そうすれば、グリッドはどの行が変更されたかを正確に知り、それらの行のみを更新します。

[EDIT]は、あなたが望むものを達成するための活動を変更するとListModelList<Activity> posts = new ListModelList<Activity>()

List<Activity> postsを交換するには、個々の行を更新するために更新このリストを(すなわちadd()またはaddAll()を呼び出す)必要があります。データベースからすべてのものをロードすることはできません。mergeデータベース内の既存のリストの変更が必要です。

+0

あなたが私に参照できるドキュメントはどれですか?あなたが言ったことは私には意味がありますが、ドキュメントのどこにそれが言及されているのかわかりません。 –

+0

@AlamSher:ビューモデルをグリッドにどのように接続しますか?上記のZULコードには 'grid'要素はありません。 –

+0

をご覧ください。正しいシナリオとコードで質問を更新しました。投稿しているうちにコードを変更したことを忘れていました。今すぐSVNから取得しました:) –

関連する問題