Base基本使用示例
Source
Output
QRCode
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>KISSY Base DEMO</title>
<style type="text/css">
body{
background: #fff;
}
</style>
<script src="//g.alicdn.com/kissy/k/5.0.1/seed.js" data-config="{combine:true}"></script> </head>
<body>
<h3>下面例子共用三个类 Person/Student/Teacher ,其中 Student 和 Teacher 都是继承自 Person ,演示结果请打开控制台查看,具体细节查看demo代码。</h3>
<label for="J_input">先选择角色再操作:</label>
<select id="J_input">
<option selected> </option>
<option value="person">Person</option>
<option value="teacher">Teacher</option>
<option value="student">Student</option>
</select>
<p>Common Operation:</p>
<div id="common">
<button id="introduce">自我介绍</button>
<br/>
<label>请输入名字(名字不能为空):</label>
<input type="text" id="Name">
<button id="setName">SetName</button>
<br/>
<label for="Age">请输入年龄(必须是数字):</label>
<input type="text" id="Age">
<button id="setAge">SetAge</button>
<br/>
<label for="changeGender">当尝试改变性别时阻止发生:</label>
<button id="changeGender">改变性别</button>
</div>
<p>Student Operation:</p>
<label for="subject">科目:</label><input type="text" id="subject">
<label for="socre">分数:</label><input type="text" id="score">
<button id="addScore">addScore</button>
<p>Teacher Opeartion:</p>
<button id="upLevel">upLevel</button>
<button id="downLevel">downLevel</button>
<script>
require(['base', 'node', 'util'], function(Base, Node, Util) {
var Level = {
PRIMARY: 0,
INTERMEDIATE: 1,
ADVANCED: 2,
SPECIAL: 3
};
var Gender = {
MALE: 0,
FEMALE: 1
};
var $ = Node.all;
// 自定义类
// 继承 Base
var Person = Base.extend({
sayHi: function(name) {
console.log("Hi, " + name + "! Nice to meet you!");
//触发自定义事件
this.fire('say');
},
tellName: function() {
console.log("My name is " + this.get('name') + ".");
this.fire('say');
},
tellAge: function() {
console.log("I'm " + this.get('age') + " years old.");
this.fire('say');
},
introduce: function(extra) {
extra = extra || 'I am a person on earth'
console.log("Hello everyone, my name is " + this.get('name') + ", and I'm " + this.get('age') + " years old." + extra);
this.fire('say');
}
},{
ATTRS: {
name: {
//设置默认值
value: "",
/*
验证name是否正确,返回值不为true则无法设置。
*/
validator: function(value) {
if ( !Util.isString(value) || value == "") {
return "Please set correct name!";
}
}
},
age: {
value: 1,
validator: function(value) {
value = parseInt(value);
if (!Util.isNumber(value) || Number.isNaN(value) || (value < 1 && value > 100)) {
return "Please set correct age!";
}
}
},
gender: {
value: Gender.MALE,
/*
指定setter和getter方法的操作
*/
setter: function(value) {
if ( Util.isString(value) ) {
return Gender[value.toUpperCase()];
}
return value;
},
getter: function(value) {
return Util.keys(Gender)[value];
},
validator: function(value) {
var str = Util.isString(value) && !(value.toUpperCase() in Gender);
var num = value > 1 || value < 0;
if (str || num) {
return "Gender must be Female or Male!";
}
}
}
}
});
window.person = new Person({
name: "Andy",
age: 18,
gender: "female"
});
/*
阻止改变性别
*/
person.on('beforeGenderChange', function(ev) {
ev.preventDefault();
console.log("Gender can't change!");
});
/*
任何属性变化时,给出提醒
*/
person.on('*Change', function(ev) {
console.log('Change ' + ev.attrName + ': ' + ev.prevVal + ' --> ' + ev.newVal);
});
/*
继承Person
*/
var Student = Person.extend({
introduce: function() {
//调用父类方法
this.callSuper("I'm a student of " + this.get('school') + ".My hometown is " + this.get('from') + ".");
},
addScore: function(subject, score) {
//error异常收集
//设置子属性
this.set('score.' + subject, score, {
error: function(e) {
console.log(e);
}
});
},
/*
bind属性变化的方法
*/
_onSetScore: function(value, ev) {
if (!Util.isEmptyObject(value)) {
console.log('Score change');
console.log(this.get('score'));
}
}
}, {
ATTRS: {
school: {
value: ""
},
from: {
value: ""
},
score: {
//验证支持对子属性的验证
validator: function(value) {
return (value.math >= 0 && value.math <= 100);
}
}
}
});
var Teacher = Person.extend({
introduce: function() {
this.callSuper("I'm a " + this.get('level') + "teacher, and I teach " + this.get('teach') + ".");
},
upLevel: function() {
this.set('level', this.get('level') + 1, {
error: function(e) {
console.log(e);
}
});
},
downLevel: function() {
this.set('level', this.get('level') - 1, {
error: function(e) {
console.log(e);
}
});
}
}, {
ATTRS: {
teach: {
value: ""
},
level: {
value: Level.PRIMARY,
setter: function(value) {
if ( Util.isString(value) ) {
return Level[value.toUpperCase()];
}
return value;
}
}
}
});
window.student = new Student({
name: "Jim",
age: 20,
school: 'MIT',
from: 'China'
});
/*
阻止改变性别
*/
student.on('beforeGenderChange', function(ev) {
ev.preventDefault();
console.log("Gender can't change!");
});
window.teacher = new Teacher({
name: "David",
age: 50,
gender: Gender.MALE,
teach: "Math",
level: Level["INTERMEDIATE"]
});
/*
阻止改变性别
*/
teacher.on('beforeGenderChange', function(ev) {
ev.preventDefault();
console.log("Gender can't change!");
});
teacher.on('beforeLevelChange', function(ev) {
if (ev.newVal > Level.SPECIAL) {
ev.preventDefault();
console.log("This teacher is already highest level!");
return;
} else if (ev.newVal < Level.PRIMARY) {
ev.preventDefault();
console.log("This teacher is already lowest level!");
return;
}
});
//在level变化后的事件
teacher.on('afterLevelChange', function(ev) {
if (ev.prevVal < ev.newVal) {
console.log("Congratulation!");
} else {
console.log("I'm sorry to hear that!");
}
});
//自定义事件
person.on('say', function(ev) {
console.log("everyone hear!");
});
$("#common").delegate('click', 'button', function(event) {
var target = $(event.currentTarget),
id = target.attr("id"),
type = $("#J_input").val();
if (type != "") {
switch(id) {
case 'introduce':
window[type].introduce();
break;
case 'setName':
var name = $("#Name").val();
window[type].set('name', name, {
error: function(e) {
console.log(e);
}
});
break;
case 'setAge':
var age = $("#Age").val();
window[type].set('age', age, {
error: function(e) {
console.log(e);
}
});
break;
case 'changeGender':
var gender = Gender[window[type].get('gender')];
gender = gender == 0 ? 1 : 0;
gender = Util.keys(Gender)[gender];
window[type].set('gender', Gender[gender], {
error: function(e) {
console.log(e);
}
});
break;
default:
break;
}
}
});
$("#addScore").on('click', function(event) {
var subject = $("#subject").val();
var score = $("#score").val();
if (subject && parseInt(score)) {
student.addScore(subject, score);
}
});
$("#upLevel").on('click', function(event) {
teacher.upLevel();
});
$("#downLevel").on('click', function(event) {
teacher.downLevel();
});
});
</script>
</body>
</html>