[关闭]
@bravf 2014-06-25T04:00:03.000000Z 字数 6803 阅读 1711

Stars API介绍

javascript


上一篇中,我们介绍了Stars的场景,今天介绍api。

Stars.FormControl

  1. <form id="myForm"></form>
  2. <div id="myForm2" data-stars-type="form"></div>
  3. <button class="submitBtn">提交</button>
  4. <script>
  5. var myFormControl = new Stars.FormControl('#myForm')
  6. var myForm2Control = new Stars.FormControl('#myForm2')
  7. var myFormControl = Stars.control('#myFrom')
  8. var myForm2Control = Stars.control('#myForm2')
  9. $('.submitBtn').on('click', function (){
  10. if (myFormControl.check()){
  11. //验证通过
  12. }
  13. else {
  14. //验证没通过
  15. }
  16. })
  17. </script>

可以通过new一个FormControl对象,也可以通过Stars.control快捷方式,注意如果不是form元素在用快捷方式时候要标记上data-stars-type="form"。

Stars.TextControl

  1. <input type="text" placeholder="请填写5-10个数字(可为空)" id="num"/>
  2. <span id="numTip"></span>
  3. <script>
  4. //对应input的control
  5. var numControl = new Stars.TextControl('#num')
  6. //如果用快捷方式numControl = Stars.control('#num')
  7. //必填规则
  8. var requiredRule = Stars.required()
  9. //可为空规则(就是对必填取非)
  10. var notRequiredRule = new Stars.NotRule(requiredRule)
  11. //或者用快捷方式notRequiredRule = Stars.not(requiredRule)
  12. //数字规则
  13. var numRule = new Stars.RegRule(/^\d+$/, '必须是数字')
  14. //长度规则
  15. var lenRule = new Stars.FuncRule(function (control){
  16. var len = control.val().length
  17. return len>=5 && len<=10
  18. }, '长度在5-10之间')
  19. //或者用快捷方式lenRule = Stars.length([5, 11], '长度在5-10之间')
  20. //数字和长度规则要同时满足
  21. var numLenRule = new Stars.AndRule(numRule, lenRule)
  22. //或者用快捷方式numLenRule = Stars.and(numRule, lenRule)
  23. //可为空和(数字和长度规则)只需要满足一个
  24. var emptyOrNumLenRule = new Stars.OrRule(notRequiredRule, numLenRule)
  25. //或者用快捷方式emptyOrNumLenRule = Stars.or(notRequiredRule, numLenRule)
  26. //把规则添加到numControl
  27. numControl.add(emptyOrNumLenRule)
  28. //给numContrl设置提示信息的展示位置
  29. numControl.setTipEle('#numTip')
  30. //把numControl添加到formControl中
  31. myFormControl.add(numControl)
  32. //********************************************
  33. //整个上面如果都用快捷方式写
  34. with(Stars){
  35. myFormControl.add(
  36. control('#num').add(
  37. or(
  38. not(required()),
  39. and(
  40. rule(/^\d+$/, '必须是数字'),
  41. length([5, 11], '长度在5-10之间')
  42. )
  43. )
  44. ).setTipEle('#numTip')
  45. )
  46. }
  47. </script>

上面例子基本解释了rule相关的基础类和组合类,再复杂的规则也可以自由组合出来,并且伴有针对不同规则有不同的提示。

Stars.RadioControl

  1. <input type="radio" id="isCheck"/>
  2. <script>
  3. new Stars.RadioControl('#isCheck')//或者Stars.control('#isCheck')
  4. </script>

Stars.SelectControl

  1. <select id="mySelect">
  2. <option value="-1">请选择</option>
  3. <option value="1">北京</option>
  4. </select>
  5. <script>
  6. new Stars.SelectControl('#mySelect')//或者Stars.control('#mySelect')
  7. </script>

Stars.CheckboxControl

  1. <input type="checkbox" id="myCB"/>
  2. <script>
  3. new Stars.CheckboxControl('myCB')//或者Stars.control('myCB')
  4. </script>

Stars.AndControl && Stars.OrControl

  1. <p class="words">请提交您的退款原因,以便我们改进服务(至少选一项)</p>
  2. <input type="checkbox" class="Qt_checkbox " value="1"/>预约不上
  3. <input type="checkbox" class="Qt_checkbox " value="2"/>计划有变,没时间消费
  4. <input type="checkbox" class="Qt_checkbox reason-other" value="8"/>其它
  5. <textarea class="Qt_textb reason-other-txt" style="display:none"></textarea>
  6. <div class="notice reason-notice" style="display:none"></div>
  7. <script>
  8. var tips = [
  9. '请至少选择一张骆驼券',
  10. '提出您的宝贵意见,1~400个字',
  11. '请至少选择一种退款原因'
  12. ]
  13. var $otherReasonTxt = $('.reason-other-txt')
  14. var $reasonList = $('input')
  15. var $other = $('.reason-other')
  16. //至少选一项退款原因
  17. var anyControl = Stars.any($reasonList, tips[2])
  18. //其他原因没选中
  19. var emptyOtherControl = Stars.control($other).add(Stars.not(Stars.required()))
  20. //其他原因选中
  21. var requiredOtherControl = Stars.control($other).add(Stars.required(tips[1]))
  22. //其他原因细节内容长度在1-400
  23. var otherTxtControl = Stars.control($otherReasonTxt).add(Stars.length([1, 401], tips[1]))
  24. //当其他原因选中时候才检测其他原因内容
  25. var andOtherControl = new Stars.AndControl(requiredOtherControl, otherTxtControl)
  26. //或者用快捷方式andOtherControl = Stars.And(requiredOtherControl, otherTxtControl)
  27. //要么其他原因不选中,要么选中
  28. var orOtherControl = new Stars.OrControl(emptyOtherControl, andOtherControl)
  29. //或者用快捷方式orOtherControl = Stars.or(emptyOtherControl, andOtherControl)
  30. //至少选择一个退款原因和"要么其他原因不选中,要么选中"要同时满足
  31. var allControl = Stars.and(anyControl, orOtherControl)
  32. //***********************************
  33. //以上都用快捷方式来表示
  34. with (Stars){
  35. myform.add(
  36. //下面两个情况要同时满足
  37. and(
  38. //至少选一个
  39. any($reasonList, tips[2]),
  40. //下面规则至少满足一个
  41. or(
  42. //$other没选中
  43. control($other).add(not(required())),
  44. //下面两个情况要同时满足
  45. and(
  46. //$other选中
  47. control($other).add(required(tips[1])),
  48. //$otherReasonTxt内容长度在1-400,length前闭后开
  49. control($otherReasonTxt).add(length([1, 401], tips[1]))
  50. )
  51. )
  52. //设置提示的位置
  53. ).setTipEle('.reason-notice')
  54. )
  55. }
  56. </script>

上面例子基本描述了control相关的基础类和组合类,用来解决表单元素和元素之间有联动的时候如何描述之间的关系。

Stars.IORule

  1. new Stars.IORule('/hello.php?name=', function (control, data){
  2. return data.status
  3. }, '用户名已经存在')

重点说下IORule,它一般指的是ajax验证,由于是异步验证,而其他rule都是同步验证,导致模型不一,很难处理,一开始在IORule的check方法中会返回一个Promise对象,然后在集合中对Promise对象单独处理,而其他都是简单处理一个bool值,从而导致Stars系统内部实现很混乱。所以在比较长的时间内我去掉了对IORule的支持,于是系统内部变的比较简单可靠,因为都是同步,但终究算不上完美。

后来终于想明白可以通过转化为状态机来变异步为同步,实际上很简单,就是在IORule记录一个自己当前的验证状态status,在check方法中只要返回status即可,ajax执行完毕后修改状态再强制对应的control做一次整体check,问题就解决了,变成了同步check,系统就无需对IORule做任何妥协。下面是一个例子:

  1. <input type="checkbox" id="isNum"/>是否注册编号
  2. <input type="text" id="num" placeholder="5位数字编号"/>
  3. <span id="numTip"></span>
  4. <script>
  5. function numIOCheck(control, data){
  6. return data.status
  7. }
  8. with (Stars){
  9. css.controlError = 'error'
  10. var numControl = control('#num').add(
  11. rule(/^\d+$/, '必须是数字'),
  12. length([5, 6], '长度必须是5'),
  13. rule('http://localhost/gitcafe/Stars/io.json?x=', numIOCheck, '编号已经存在')
  14. )
  15. or(
  16. control('#isNum').add(not(required())),
  17. and(
  18. control('#isNum').add(required()),
  19. numControl
  20. )
  21. ).setTipEle('#numTip')
  22. }
  23. </script>

Stars.RegRule

  1. new Stars.RegRule(/\d+/, 'msg')

Stars.FuncRule

  1. new Stars.FuncRule(function (control){
  2. //control参数为funcRule所属control对象
  3. }, 'msg')

Stars.NotRule

  1. var rule = new Stars.RegRule(/\d+/, 'msg')
  2. var notRule = new Stars.NotRule(rule)//NotRule对一个rule的check结果取反

Stars.AndRule

  1. new Stars.AndRule(rule1, rule2)//rule1和rule2要同时满足

Stars.OrRule

  1. new Stars.OrRule(rule1, rule2)//rule1和rule2满足一个即可

Stars.rule

  1. //根据参数生成不同的rule对象
  2. Stars.rule(/\d+/, 'msg')
  3. Stars.rule(function(){}, 'msg')

Stars.not

  1. //Stars.NotRule的快捷方式
  2. Stars.not(rule1) == new Stars.NotRule(rule1)

Stars.control

  1. //根据参数不同生成不同的control,主要根据元素的tag类型
  2. Stars.control('#form') == new Stars.FormContorl('#form')
  3. Stars.control('#input') == new Stars.TextControl('#input')
  4. Stars.control('#select') == new Stars.SelectContrl('#select')
  5. .....

Stars.and

  1. //Stars.AndRule或者Stars.AndControl的快捷方式,根据参数动态判断是rule还是control
  2. Stars.and(rule1, rule2) == new Stars.AndRule(rule1, rule2)
  3. Stars.and(control1, control2) == new Stars.AndControl(control1, control2)

Stars.or

  1. //Stars.OrRule或者Stars.OrControl的快捷方式,根据参数动态判断是rule还是control
  2. Stars.or(rule1, rule2) == new Stars.OrRule(rule1, rule2)
  3. Stars.or(control1, control2) == new Stars.OrControl(control1, control2)

Stars.required

  1. //属于Stars.FuncRule的一个实例,用来验证是否为空。如果被验证的control为TextControl则判断内容长度是否大于0,如果为checkbox或者radio则判断是否选中,如果为select则判断value是否为-1。
  2. var rule1 = Stars.required('不能为空')
  3. control1.add(rule1)

Stars.length

  1. //属于Stars.FuncRule的一个实例,用来验证长度。
  2. var rule1 = Stars.length([1,5], '长度在1-4')//区间前闭后开
  3. var rule2 = Stars.length([1], '长度大于1')
  4. var rule3 = Stars.length([,5], ‘长度小于5’)

Stars.any

  1. //属于Stars.OrControl的一个实例,用来针对radio、checkbox组,至少选一个
  2. Stars.any($radioList)

在这里你可以了解他的全部 Stars

有问题可以随时咨询我
qq: 765621103
email: bravfing@126.com

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注