2012-03-12 144 views
2

我想使用Liftscreen在ajax中实现一个表单,但我想使用Ajax,也就是说,我希望在更新字段时调用finish函数。通常我会使用像SHtml.ajaxText这样的函数来实现这个目标,但我更喜欢使用LiftScreen,因为它已经包含了很多例程。Liftweb - LiftScreen和ajax

这里是代码一个基本的例子,我使用

class ScreenTest extends LiftScreen { 

    // here are the fields and default values 
    val name = field("Name", "") 

    // the age has validation rules 
    val age = field("Age", 0, minVal(13, "Too Young")) 

    def finish() { 
    println("-------> Finish function has be called") 
    S.notice("Name: "+name) 
    S.notice("Age: "+age) 
    } 
} 

所以我想结束函数每当场nameage被称为被调用。我更喜欢一般设置,而不是在每个字段中手动调用finish

更新根据一些标准,我在搜索引擎上工作,所以我希望在修改条件时更新结果。

我已经读到LiftScreen文档页面上Assembla,我也正式邮件列表(如果我不能在这里找到任何答案,我会联系)

+0

你是什么意思的“叫”?这是关注点吗? – Lukasz 2012-03-13 08:37:44

+0

@Lukasz我的意思是我希望函数finish()在名字或年龄被修改时打印名字和年龄。我正在根据一些标准在搜索引擎上工作,所以我希望在修改标准时更新结果。 – 2012-03-13 10:04:39

回答

1

我会尝试找到约ajax on LiftScreen讨论在您用于屏幕的模板中添加一个小javascript(向导 - 全部?)。例如:

jQuery('input').change(function() { 
    jQuery('#idOfForm').submit(); 
}); 

不确定是否可以从LiftScreen代码段添加这样的脚本。

编辑 另一种方法是使用wiki here中描述的自定义字段。我认为你可以做些什么:

object AjaxifiedScreen extends LiftScreen { 
    val name = new Field { 
    type ValueType = String 
    override def name = "name" 
    override implicit def manifest = buildIt[String] 
    override def default = "" 
    override def toForm: Box[NodeSeq] = SHtml.ajaxText(is, doStuff(_)) 
    } 
} 
+0

是的,但我正在寻找已在LiftScreen中实施的更全面的解决方案,但是如果它不存在,我将不得不使用此方法。 – 2012-03-15 13:46:13

+1

编辑答案。我相信,通过ajaxText你可以使用一个onblur事件。 – 2012-03-15 21:33:38

+0

这实际上更接近我的视野,我跳过它存在一个“默认”行为,但因为它似乎并非如此,我会用这个,非常感谢您的帮助。 – 2012-03-16 08:24:56