1

liftweb 2.4scala Web フレームワークを使用して構築されたアプリで検証メッセージを表示しようとしています。
このアプリには、テキストをデータベースに追加するためのテキスト ボックスと送信ボタンが 1 つしかありません。送信時に、スニペット コードはテキスト ボックスが空かどうかをチェックし、メッセージを表示します。

 package snippet {

object Notes {

  def noteForm(in: NodeSeq): NodeSeq = {
    def add() = {
      if (note.description.isEmpty()) {
        S.error("descError", "Please enter a note")
      } else {
        note.save
        NotesServer ! "refresh"
        S.notice("descMessage", "Note added.")
      }

    }
    bind("f", in,
      "desc" -%> SHtml.text(note.description.is, note.description(_)),
      "submit" -%> SHtml.submit("Note It !", add)) ++ SHtml.hidden(add _)
  }

  def delete(note: Note): JsCmd = {
    note.delete_!
    NotesServer ! "refresh"
    S.notice("descMessage", "Note deleted.")
  }

}

object note extends RequestVar[Note]({ Note.create })

}

htmlは

 <lift:surround with="default" at="content">
<div class="row">
    <div class="span11">
        <form class="lift:form.ajax">
            <lift:Notes.noteForm>
                <f:desc id="desc" placeholder="what do you want to note?"
                    class="xxlarge" />
                <f:submit class="btn primary" />
            </lift:Notes.noteForm>
        </form>
    </div>
</div>

<div class="row">
    <div class="span11">
        <lift:msg id="descError" errorClass="alert-message error" />
        <lift:msg id="descMessage" noticeClass="alert-message success" />
    </div>
</div>

    <div class="lift:comet?type=NotesComet" id="notes">
        <div class="row show-grid">
            <div class="note span10 lpad20">
                <div style="display: inline" class="desclist"></div>
                <a class="close rpad10 tpad10" href="javascript://">&times;</a>
            </div>
        </div>
    </div>

コメットのコード

object NotesServer extends LiftActor with ListenerManager {

def createUpdate =  Note.allNotes


override def lowPriority = _ match{
  case "refresh" => updateListeners()
}

}  
class NotesComet extends CometActor with CometListener {
 private var notes: List[Note] = List()

 def registerWith = NotesServer

 override def lowPriority = {
  case n: List[Note] => notes = n; reRender()
 }

def render = "#notes" #> {
  (notes.reverse.map(note => ".desclist *" #> note.description &
  ".close [onclick]" #> ajaxInvoke(() => Notes.delete(note))))
}

}  

メッセージ表示は初回のみフェードイン、フェードアウトで完全に動作しますが、その後失敗します。

これが私がBoot.scalaフェードインとフェードアウトのために持っているものです

LiftRules.noticesEffects.default.set((notice: Box[NoticeType.Value], id: String) => {
  Full(JqJsCmds.FadeOut(id, 2 seconds, 2 seconds))
})

次のリフトタグ

<lift:msg id="descError" errorClass="alert-message error" />

生産する

<span id="descError" ></span>

送信後、上記の html は次のように変更されます。フェードインとフェードアウトは完全に機能します

<span id="descError" style="display: none;">
<span id="descError">
    <span class="alert-message error">Please enter a note</span>
</span>
</span>

後続の送信イベントでは、同じ ID を持つ 2 つのスパン タグがあるため、メッセージは表示されませんdescError

問題は明確になりましたが、これを修正する方法がわかりません。

アップデート

私はliftweb 2.5-M3で同じコードを試しましたが、送信後に生成されたhtmlが次のようになっていることに気づきました。

<span id="descError" style="display: none;">
    <span class="alert-message error">Please enter a note</span>
</span>  

ただし、その後の送信ではメッセージは表示されません。

4

0 に答える 0