常见问题

    首先我们需要引入IE7.jshttps://github.com/roylory/ie7-js/blob/master/lib/IE7.js

    然后JSON.js

    最后是Promise库

    https://github.com/RubyLouvre/avalon/blob/master/test/promise.js

    当然,前4个常用的库可以打包,或者全部打包

    开发时,最好一边开发一边在IE8下测试(因为IE8下有开发者工具,能模拟IE6的情况),不要全部开发完再测试IE6

    如何隐藏首屏加载页面时出现的花括号

    :在页面上添加一个样式

    1. .ms-controller{
    2. visibility: hidden
    3. }
    1. <div ms-controller="test" class="ms-controller">{{@aaa}}</div>

    IE6-8下为vm的数组重新赋给一个新数组失败?

    1. vm.arr2 = vm.arr1 //报错

    记住,任何时候,不能将vm中的数组或子对象取出来,再用它们赋给vm的某个数组或子对象,因为放在vm中的数组与子对象已经变成VM了,而VM重写VM不被允许的.

    并且你要保证原数据不被污染,需要使用深拷贝.

    你也可以这样,将原数据转换为纯数据就行了

    1. vm.arr2 = vm.arr1.$model //正常

    为什么我的指令没有效果?

    1. <p title="att-{{ddd}}">例子!</p>

    :因为avalon只会对ms-*属性敏感, 另外, 花括号里的ddd要加上@,即

    1. <p ms-attr="{title: 'att-'+ @ddd}">例子!</p>

    : avalon2支持onReady方法

    对表单元素的值输入进行限制

    比如说我们限制只能输入数字

    1. <script>
    2. avalon.define({
    3. $id: 'test',
    4. aaa: 111,
    5. fix: function(e){
    6. e.target.value = e.target.value.replace(/\D+/, '')
    7. }
    8. })
    9. </script>
    10. <body :controller="test">
    11. <input :duplex-number="@aaa" :input="@fix"/>{{@aaa}}
    12. </body>

    如果手动执行验证

    : ms-validate提供了各种全自动的验证.但可能大家需要手动执行验证表单在ms-validate的配置对象上添加一个onManual,页面被扫描后,你就可能拿这个方法来自己执行验证

    1. <!doctype html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Drag-Drop</title>
    6. </head>
    7. <body>
    8. <div ms-controller="validate1">
    9. <form ms-validate="@validate">
    10. <p><input ms-duplex="@aaa" placeholder="username"
    11. <p><input type="password" id="pw" placeholder="password"
    12. ms-rules='{required:true}'
    13. ms-duplex="@bbb" /></p>
    14. <p><input type="password"
    15. ms-rules="{required:true,equalto:'pw'}" placeholder="再填一次"
    16. ms-duplex="@ccc | change" /></p>
    17. <p><input type="submit" value="submit"/></p>
    18. </form>
    19. </div>
    20. <script>
    21. var vm = avalon.define({
    22. $id: "validate1",
    23. aaa: "",
    24. bbb: '',
    25. ccc: '',
    26. validate: {
    27. onManual:avalon.noop,//IE6-8必须指定,avalon一会儿会重写这方法
    28. onError: function (reasons) {
    29. reasons.forEach(function (reason) {
    30. console.log(reason.getMessage())
    31. })
    32. },
    33. onValidateAll: function (reasons) {//它会被onManual调用
    34. if (reasons.length) {
    35. console.log('有表单没有通过')
    36. } else {
    37. console.log('全部通过')
    38. }
    39. }
    40. }
    41. })
    42. setTimeout(function(){
    43. })
    44. </script>
    45. </body>
    46. </html>

    页面用了avalon后, 元素间没有距离了

    答: 因为avalon在页面加载好后,会清掉所有空白文本,减少页面的节点数,从而减少以后diff的节点个数. 详见.

    : 最好指定全局不重复的$id,特别在ms-for循环中,必须指定$id

    1. <html>
    2. <head>
    3. <title></title>
    4. <meta charset="UTF-8">
    5. <script src="../dist/avalon.js"></script>
    6. <script>
    7. var vm = avalon.define({
    8. $id: 'test',
    9. tests: [0,1]
    10. })
    11. avalon.component('ms-button', {
    12. template: '<button type="button"><span><slot name="buttonText"></slot></span></button>',
    13. defaults: {
    14. buttonText: "默认内容"
    15. },
    16. soleSlot: 'buttonText'
    17. })
    18. </script>
    19. </head>
    20. <body>
    21. <ul ms-controller="test">
    22. <li ms-for="(index,test) in @tests">
    23. <span ms-text="test"></span>
    24. <wbr ms-widget='{is:"ms-button",$id:"btn_"+index}'/>
    25. </li>
    26. </ul>
    27. </body>
    28. </html>

    ajax提交出问题

    请确保你提交的数据是纯JS数据,而不是vm。请见

    为什么我的日期不能同步

    1. var vm = avalon.define({
    2. $id:'aaa',
    3. date: new Date
    4. })
    5. setTimeout(function(){
    6. }, 1000)

    : 因为avalon只会对number, string, boolean, 纯对象, 纯数组这几个类型同步, 其他类型需要转换.将上面的new Date改成new Date - 0即可

    如何将页面模块化?

    : https://github.com/RubyLouvre/avalon/issues/1655