隨着avalon的普及,越來越多人加入avalon的大家庭。隨之而來的是各種問題。本文在這里統一解答一下。
使用avalon基本上有幾個方針要堅持
- 數據必須先定義后使用,只能VM中定義,不能V中定義。
- 數據必須先打扁后使用,比如對象的層次不宜太深,數組不能太長。
- 頁面上不使用太復雜的邏輯,需要的話請封裝成函數,也方便自己或后人維護調試。
- IE下方法名,屬性名注意不區分大小寫(因為是VBS)。
- IE下方法中的this不一定指向自身。
- avalon在domReady時自己執行了一次scan,對於后插入的DOM結構,需要自己手動scan。
SCRIPT1028: 缺少標識符、字符串或數字
這只發生於IE6-7,它不支持對象最后一個鍵值對后面添加逗號,如
vm.$bOpts = {
header: "提示信息title",
content: "提示信息content",
}
SCRIPT1041: 名稱重定義
這是avalon在IE6-8使用VBScript對象創建VM對象引起的,VB對象不支持為對象添加兩個相同的屬性名
avalon.define("test", function(vm){
vm.aaa = 1
avalon.mix(vm, {
aaa: 2, //這里出問題了
bbb: 3
})
})
此外,由於VBScript變量名不區分大小寫
vm.user = {username: 'lili', userName: 'lilililili'}
這樣也會報名稱重定義 Error!
異步重寫空對象出錯
這是用法問題
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<script src="avalon.js" type="text/javascript"></script>
<script>
var model = avalon.define("test", function(vm) {
vm.data = {}
})
setTimeout(function() {
var data = {
a: 1,
b: 2,
c: 3
}
model.data = data //這樣正常
// avalon.mix(model.data, data) //這樣會報錯
}, 1000)
</script>
<style>
#aaa{
width: 100%;
height:200px;
background:green;
}
</style>
</head>
<body ms-controller="test">
<input ms-duplex="data.a"/>
</body>
</html>
事件回調的this對象$model, $vmodels不見了的問題
1.3.5已經廢掉, 源碼搜data.param.replace(/-\d+$/, "") ,加上這幾行
try{
elem.$vmodel = vmodels[0]
elem.$vmodels = vmodels
}catch(e){}
或者通過ms-click=callback(avalon.vmodels.xxx)傳入你的$vmodel
放在button標簽的事件點擊沒有生效
button標簽默認會提交頁面,產生跳轉,因此需要指定type="button",即<buttton type=button ms-click=check >
顯示隱藏切換失敗
<div class="inp,inte" ms-visible="integralCount > 0 && intergralCount > maxIntegral + spendIntegral" >
已超出可使用積分({{maxIntegral/100}}元),請重新輸入
<div>
原因,不要在視圖的指令里面寫&& , ||, 請封裝為函數
<div class="inp,inte" ms-visible="isVisible(integralCount, maxIntegral ,spendIntegral)" >
已超出可使用積分({{maxIntegral/100}}元),請重新輸入
<div>
交互數組中兩個元素的位置失敗
原因,只能通過數組方法,比如splice進行移出插入操作
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<title>
Avalon splice issue
</title>
<meta charset="utf-8">
</head>
<body>
<ul ms-controller="test">
<li ms-repeat="items">{{ el.name }}</li>
</ul>
<script src="avalon.js"></script>
<script>
var test = avalon.define('test', function(vm) {
vm.items = [
{
name: 'First lady'
},
{
name: 'Second boy'
},
{
name: 'Third guy'
}
];
});
var temp = test.items.splice(2, 1);
test.items.splice(1, 0, temp[0].$model);//如果是簡單數據類型,就不需要.$model
</script>
</body>
</html>
IE6-8下報window.execScript 這一行錯誤
、可能是你的VM上定義了一個很大的數組引發的
vm.err大IE6-8下報錯
type, err, erm, me是VBScript關鍵字
ms-controller="aaa",aaa這個VM只能應用一個元素上,頁面上不能 出現一個VM同時應用於兩個元素
低版本IE使用VBScript,不支持未婚先孕!
如有更多問題,請統一在這里提 https://github.com/RubyLouvre/avalon/issues/509
