avalon2
Version:
an elegant efficient express mvvm framework
198 lines (175 loc) • 5.87 kB
JavaScript
import { avalon } from '../../src/seed/core'
describe('controller', function() {
var body = document.body,
div, vm, h1, h2, h3, cdiv
beforeEach(function() {
div = document.createElement('div')
body.appendChild(div)
})
afterEach(function() {
body.removeChild(div)
delete avalon.vmodels[vm && vm.$id]
})
it('default', function(done) {
div.innerHTML = heredoc(function() {
/*
<div ms-controller="root">
<h1>{{@page}}</h1>
<div ms-controller="first">
<h2 ms-text="@page"></h2>
<div ms-if="@page=='first'">
<div ms-controller="second">
<h3 ms-html="@page"></h3>
<div ms-if="@page == 'second'" id="cdiv">{{@level}}-{{@page}}-{{@kind}}</div>
</div>
</div>
</div>
</div>
*/
})
body.appendChild(div)
var root = avalon.define({
$id: 'root',
page: 'root',
level: 'root'
});
var first = avalon.define({
$id: 'first',
page: 'first',
kind: 'first'
});
var second = avalon.define({
$id: 'second',
page: 'second',
grade: "second"
});
avalon.scan(div)
setTimeout(function() {
h1 = div.getElementsByTagName('h1')[0]
h2 = div.getElementsByTagName('h2')[0]
h3 = div.getElementsByTagName('h3')[0]
cdiv = document.getElementById('cdiv')
expect(h1.innerHTML).toBe(root.page)
expect(h2.innerHTML).toBe(first.page)
expect(h3.innerHTML).toBe(second.page)
expect(cdiv.innerHTML).toBe([root.level, second.page, first.kind].join('-'))
first.page = 'A'
setTimeout(function() {
h1 = div.getElementsByTagName('h1')[0]
h2 = div.getElementsByTagName('h2')[0]
h3 = div.getElementsByTagName('h3')[0]
cdiv = document.getElementById('cdiv')
expect(h1.innerHTML).toBe(root.page)
expect(h2.innerHTML).toBe(first.page)
expect(!!h3).toBe(false)
expect(!!cdiv).toBe(false)
first.page = 'first'
second.page = 'B'
setTimeout(function() {
h1 = div.getElementsByTagName('h1')[0]
h2 = div.getElementsByTagName('h2')[0]
h3 = div.getElementsByTagName('h3')[0]
cdiv = document.getElementById('cdiv')
expect(h1.innerHTML + "!").toBe(root.page + "!")
expect(h2.innerHTML + "!!").toBe(first.page + "!!")
expect(h3.innerHTML + "!!!").toBe(second.page + "!!!")
expect(!!cdiv).toBe(false)
setTimeout(function() {
delete avalon.vmodels.root
delete avalon.vmodels.first
delete avalon.vmodels.second
done()
})
})
}, 100)
}, 100)
})
it('ms-controller 嵌套报错', function(done) {
//https://github.com/RubyLouvre/avalon/issues/1811
div.innerHTML = heredoc(function() {
/*
<div ms-controller="ctrl11">
<blockquote ms-html="@tpl"></blockquote>
<button ms-click="@switch1" type='button'>aaaa</button>
</div>
*/
})
var v123 = heredoc(function() {
/*
<div ms-controller="ctrl12">
<p ms-click="@alert">123</p>
{{@ggg.value}}
</div>
*/
})
delete avalon.vmodels.ccc
vm = avalon.define({
$id: 'ctrl11',
tpl: "",
ggg: { value: 111 },
switch1: function() {
vm.tpl = v123
}
});
var vm2 = avalon.define({
$id: 'ctrl22',
ddd: 'aaaa',
alert: function() {
avalon.log('????')
}
});
avalon.scan(div)
setTimeout(function() {
var button = div.getElementsByTagName('button')[0]
fireClick(button)
console.log('33333')
setTimeout(function() {
var blockquote = div.getElementsByTagName('blockquote')[0]
console.log(blockquote[textProp], '111')
var text = blockquote[textProp].replace(/[\r\n\s]/g, '').trim()
expect(text).toBe('123111')
delete avalon.vmodels.ccc1
done()
}, 100)
}, 100)
})
it('确保内部的onReady也能执行', function(done) {
div.innerHTML = heredoc(function() {
/*
<div ms-controller="nest01">
<div ms-controller="nest02">
<div ms-controller="nest03">
111
</div>
</div>
</div>
*/
})
var add = ''
vm = avalon.define({
$id: "nest01"
})
vm.$watch('onReady', function() {
add += '111'
})
var vm2 = avalon.define({
$id: "nest02"
})
vm2.$watch('onReady', function() {
add += '222'
})
var vm3 = avalon.define({
$id: "nest03"
})
vm3.$watch('onReady', function() {
add += '333'
})
avalon.scan(div)
setTimeout(function() {
expect(add).toBe('333222111')
done()
delete avalon.vmodels.nest03
delete avalon.vmodels.nest02
}, 100)
})
})