omi 0.1.2 - fix this.data problem

This commit is contained in:
kmdjs 2017-02-08 09:44:31 +08:00
parent 239ea9eacd
commit 3f02e72103
14 changed files with 249 additions and 168 deletions

17
dist/omi.js vendored
View File

@ -1,5 +1,5 @@
/*!
* Omi v0.1.1 By dntzhang
* Omi v0.1.2 By dntzhang
* Github: https://github.com/AlloyTeam/omi
* MIT Licensed.
*/
@ -916,9 +916,9 @@ return /******/ (function(modules) { // webpackBootstrap
this.renderTo = typeof data === "string" ? document.querySelector(data) : data;
this._hidden = this.renderTo.querySelector('.omi_scoped__hidden_data');
this.id = this._hidden.dataset.omiId;
this.data = JSON.parse(this._hidden.value);
this.data = this._data = JSON.parse(this._hidden.value);
} else {
this.data = data || {};
this.data = this._data = data || {};
this._omi_server_rendering = server;
this.id = this._omi_server_rendering ? 1000000 + _omi2.default.getInstanceId() : _omi2.default.getInstanceId();
}
@ -931,7 +931,6 @@ return /******/ (function(modules) { // webpackBootstrap
_omi2.default.instances[this.id] = this;
this.BODY_ELEMENT = document.createElement('body');
this._preCSS = null;
this._combinedData = null;
if (this._omi_server_rendering || isReRendering) {
this.install();
this._render(true);
@ -1128,7 +1127,7 @@ return /******/ (function(modules) { // webpackBootstrap
}
childStr = childStr.replace("<child", "<div").replace("/>", "></div>");
this._mergeData(childStr, isFirst);
this._generateHTMLCSS(true);
this._generateHTMLCSS();
this._extractChildren(this);
if (isFirst) {
this.children.forEach(function (item, index) {
@ -1231,12 +1230,12 @@ return /******/ (function(modules) { // webpackBootstrap
key: '_mergeData',
value: function _mergeData(childStr, isFirst) {
var arr = childStr.match(/\s*data=['|"](\S*)['|"]/);
this._combinedData = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this.data);
this.data = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this._data);
isFirst && this.install();
}
}, {
key: '_generateHTMLCSS',
value: function _generateHTMLCSS(isChild) {
value: function _generateHTMLCSS() {
this.CSS = this.style() || '';
if (this.CSS) {
this.CSS = _style2.default.scoper(this.CSS, "[" + _omi2.default.STYLESCOPEDPREFIX + this.id + "]");
@ -1246,10 +1245,10 @@ return /******/ (function(modules) { // webpackBootstrap
}
}
var tpl = this.render();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", isChild ? this._combinedData : this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
if (this._omi_server_rendering) {
this.HTML = '\r\n<style id="' + _omi2.default.STYLEPREFIX + this.id + '">\r\n' + this.CSS + '\r\n</style>\r\n' + this.HTML;
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(isChild ? this._combinedData : this.data) + '\' />\r\n';
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(this.data) + '\' />\r\n';
}
}
}, {

17
dist/omi.lite.js vendored
View File

@ -1,5 +1,5 @@
/*!
* Omi v0.1.1 By dntzhang
* Omi v0.1.2 By dntzhang
* Github: https://github.com/AlloyTeam/omi
* MIT Licensed.
*/
@ -299,9 +299,9 @@ return /******/ (function(modules) { // webpackBootstrap
this.renderTo = typeof data === "string" ? document.querySelector(data) : data;
this._hidden = this.renderTo.querySelector('.omi_scoped__hidden_data');
this.id = this._hidden.dataset.omiId;
this.data = JSON.parse(this._hidden.value);
this.data = this._data = JSON.parse(this._hidden.value);
} else {
this.data = data || {};
this.data = this._data = data || {};
this._omi_server_rendering = server;
this.id = this._omi_server_rendering ? 1000000 + _omi2.default.getInstanceId() : _omi2.default.getInstanceId();
}
@ -314,7 +314,6 @@ return /******/ (function(modules) { // webpackBootstrap
_omi2.default.instances[this.id] = this;
this.BODY_ELEMENT = document.createElement('body');
this._preCSS = null;
this._combinedData = null;
if (this._omi_server_rendering || isReRendering) {
this.install();
this._render(true);
@ -511,7 +510,7 @@ return /******/ (function(modules) { // webpackBootstrap
}
childStr = childStr.replace("<child", "<div").replace("/>", "></div>");
this._mergeData(childStr, isFirst);
this._generateHTMLCSS(true);
this._generateHTMLCSS();
this._extractChildren(this);
if (isFirst) {
this.children.forEach(function (item, index) {
@ -614,12 +613,12 @@ return /******/ (function(modules) { // webpackBootstrap
key: '_mergeData',
value: function _mergeData(childStr, isFirst) {
var arr = childStr.match(/\s*data=['|"](\S*)['|"]/);
this._combinedData = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this.data);
this.data = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this._data);
isFirst && this.install();
}
}, {
key: '_generateHTMLCSS',
value: function _generateHTMLCSS(isChild) {
value: function _generateHTMLCSS() {
this.CSS = this.style() || '';
if (this.CSS) {
this.CSS = _style2.default.scoper(this.CSS, "[" + _omi2.default.STYLESCOPEDPREFIX + this.id + "]");
@ -629,10 +628,10 @@ return /******/ (function(modules) { // webpackBootstrap
}
}
var tpl = this.render();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", isChild ? this._combinedData : this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
if (this._omi_server_rendering) {
this.HTML = '\r\n<style id="' + _omi2.default.STYLEPREFIX + this.id + '">\r\n' + this.CSS + '\r\n</style>\r\n' + this.HTML;
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(isChild ? this._combinedData : this.data) + '\' />\r\n';
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(this.data) + '\' />\r\n';
}
}
}, {

15
dist/omi.server.js vendored
View File

@ -924,9 +924,9 @@
this.renderTo = typeof data === "string" ? document.querySelector(data) : data;
this._hidden = this.renderTo.querySelector('.omi_scoped__hidden_data');
this.id = this._hidden.dataset.omiId;
this.data = JSON.parse(this._hidden.value);
this.data = this._data = JSON.parse(this._hidden.value);
} else {
this.data = data || {};
this.data = this._data = data || {};
this._omi_server_rendering = server;
this.id = this._omi_server_rendering ? 1000000 + _omi2.default.getInstanceId() : _omi2.default.getInstanceId();
}
@ -939,7 +939,6 @@
_omi2.default.instances[this.id] = this;
this.BODY_ELEMENT = document.createElement('body');
this._preCSS = null;
this._combinedData = null;
if (this._omi_server_rendering || isReRendering) {
this.install();
this._render(true);
@ -1136,7 +1135,7 @@
}
childStr = childStr.replace("<child", "<div").replace("/>", "></div>");
this._mergeData(childStr, isFirst);
this._generateHTMLCSS(true);
this._generateHTMLCSS();
this._extractChildren(this);
if (isFirst) {
this.children.forEach(function (item, index) {
@ -1239,12 +1238,12 @@
key: '_mergeData',
value: function _mergeData(childStr, isFirst) {
var arr = childStr.match(/\s*data=['|"](\S*)['|"]/);
this._combinedData = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this.data);
this.data = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this._data);
isFirst && this.install();
}
}, {
key: '_generateHTMLCSS',
value: function _generateHTMLCSS(isChild) {
value: function _generateHTMLCSS() {
this.CSS = this.style() || '';
if (this.CSS) {
this.CSS = _style2.default.scoper(this.CSS, "[" + _omi2.default.STYLESCOPEDPREFIX + this.id + "]");
@ -1254,10 +1253,10 @@
}
}
var tpl = this.render();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", isChild ? this._combinedData : this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
if (this._omi_server_rendering) {
this.HTML = '\r\n<style id="' + _omi2.default.STYLEPREFIX + this.id + '">\r\n' + this.CSS + '\r\n</style>\r\n' + this.HTML;
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(isChild ? this._combinedData : this.data) + '\' />\r\n';
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(this.data) + '\' />\r\n';
}
}
}, {

37
docs/cn_get_dom.md Normal file
View File

@ -0,0 +1,37 @@
<h2 id="获取DOM节点">获取DOM节点</h2>
虽然绝大部分情况下开发者不需要去查找获取DOM但是还是有需要获取DOM的场景所以Omi提供了方便获取DOM节点的方式。
### ref和refs
```js
class Hello extends Omi.Component {
constructor(data) {
super(data);
}
style () {
return `
h1{
cursor:pointer;
}
`;
}
handleClick(){
alert(this.refs.abc.innerHTML);
}
render() {
return `
<div>
<h1 ref="abc" onclick="handleClick()">Hello ,{{name}}!</h1>
</div>
`;
}
}
Omi.render(new Hello({ name : "Omi" }),"#container");
```
可以看到通过在HTML中标记ref为abc那么就通过this.refs.abc访问到该DOM节点。
[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=ref)

View File

@ -983,9 +983,9 @@
this.renderTo = typeof data === "string" ? document.querySelector(data) : data;
this._hidden = this.renderTo.querySelector('.omi_scoped__hidden_data');
this.id = this._hidden.dataset.omiId;
this.data = JSON.parse(this._hidden.value);
this.data = this._data = JSON.parse(this._hidden.value);
} else {
this.data = data || {};
this.data = this._data = data || {};
this._omi_server_rendering = server;
this.id = this._omi_server_rendering ? 1000000 + _omi2.default.getInstanceId() : _omi2.default.getInstanceId();
}
@ -998,7 +998,6 @@
_omi2.default.instances[this.id] = this;
this.BODY_ELEMENT = document.createElement('body');
this._preCSS = null;
this._combinedData = null;
if (this._omi_server_rendering || isReRendering) {
this.install();
this._render(true);
@ -1195,7 +1194,7 @@
}
childStr = childStr.replace("<child", "<div").replace("/>", "></div>");
this._mergeData(childStr, isFirst);
this._generateHTMLCSS(true);
this._generateHTMLCSS();
this._extractChildren(this);
if (isFirst) {
this.children.forEach(function (item, index) {
@ -1298,12 +1297,12 @@
key: '_mergeData',
value: function _mergeData(childStr, isFirst) {
var arr = childStr.match(/\s*data=['|"](\S*)['|"]/);
this._combinedData = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this.data);
this.data = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this._data);
isFirst && this.install();
}
}, {
key: '_generateHTMLCSS',
value: function _generateHTMLCSS(isChild) {
value: function _generateHTMLCSS() {
this.CSS = this.style() || '';
if (this.CSS) {
this.CSS = _style2.default.scoper(this.CSS, "[" + _omi2.default.STYLESCOPEDPREFIX + this.id + "]");
@ -1313,10 +1312,10 @@
}
}
var tpl = this.render();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", isChild ? this._combinedData : this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
this.HTML = this._scopedAttr(_omi2.default.template(tpl ? tpl : "", this.data), _omi2.default.STYLESCOPEDPREFIX + this.id).trim();
if (this._omi_server_rendering) {
this.HTML = '\r\n<style id="' + _omi2.default.STYLEPREFIX + this.id + '">\r\n' + this.CSS + '\r\n</style>\r\n' + this.HTML;
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(isChild ? this._combinedData : this.data) + '\' />\r\n';
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + _omi2.default.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(this.data) + '\' />\r\n';
}
}
}, {

View File

@ -1,6 +1,6 @@
{
"name": "omi",
"version": "0.1.1",
"version": "0.1.2",
"description": "Omi is Omi.",
"scripts": {
"build": "webpack -w",

View File

@ -12,9 +12,9 @@ class Component {
this.renderTo = typeof data === "string" ? document.querySelector(data) : data;
this._hidden = this.renderTo.querySelector('.omi_scoped__hidden_data');
this.id = this._hidden.dataset.omiId;
this.data = JSON.parse(this._hidden.value);
this.data = this._data = JSON.parse(this._hidden.value);
} else {
this.data = data || {};
this.data = this._data = data || {};
this._omi_server_rendering = server;
this.id = this._omi_server_rendering ? (1000000+ Omi.getInstanceId()) : Omi.getInstanceId();
}
@ -27,7 +27,6 @@ class Component {
Omi.instances[this.id] = this;
this.BODY_ELEMENT = document.createElement('body');
this._preCSS = null;
this._combinedData = null;
if (this._omi_server_rendering || isReRendering) {
this.install();
this._render(true);
@ -79,7 +78,7 @@ class Component {
this.afterUpdate();
}
setData(data,update) {
setData(data, update) {
this.data = data;
if (update) {
this.update();
@ -205,7 +204,7 @@ class Component {
}
childStr = childStr.replace("<child", "<div").replace("/>", "></div>");
this._mergeData(childStr,isFirst);
this._generateHTMLCSS(true);
this._generateHTMLCSS();
this._extractChildren(this);
if(isFirst){
this.children.forEach((item,index)=>{
@ -300,11 +299,11 @@ class Component {
_mergeData(childStr,isFirst) {
let arr = childStr.match(/\s*data=['|"](\S*)['|"]/);
this._combinedData = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this.data);
this.data = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this._data);
isFirst && this.install();
}
_generateHTMLCSS(isChild) {
_generateHTMLCSS() {
this.CSS = this.style() || '';
if (this.CSS) {
this.CSS = style.scoper(this.CSS, "[" + Omi.STYLESCOPEDPREFIX + this.id + "]");
@ -314,10 +313,10 @@ class Component {
}
}
let tpl = this.render();
this.HTML = this._scopedAttr(Omi.template(tpl ? tpl : "",isChild ? this._combinedData : this.data), Omi.STYLESCOPEDPREFIX + this.id).trim();
this.HTML = this._scopedAttr(Omi.template(tpl ? tpl : "", this.data), Omi.STYLESCOPEDPREFIX + this.id).trim();
if (this._omi_server_rendering) {
this.HTML = '\r\n<style id="'+Omi.STYLEPREFIX+this.id+'">\r\n' + this.CSS + '\r\n</style>\r\n'+this.HTML ;
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + Omi.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(isChild ? this._combinedData : this.data) + '\' />\r\n'
this.HTML += '\r\n<input type="hidden" data-omi-id="' + this.id + '" class="' + Omi.STYLESCOPEDPREFIX + '_hidden_data" value=\'' + JSON.stringify(this.data) + '\' />\r\n'
}
}

View File

@ -64,7 +64,7 @@ if(ENV === 'build'){
},
plugins: [
// Avoid publishing files when compilation fails
new webpack.BannerPlugin(" Omi v0.1.1 By dntzhang \r\n Github: https://github.com/AlloyTeam/omi\r\n MIT Licensed."),
new webpack.BannerPlugin(" Omi v0.1.2 By dntzhang \r\n Github: https://github.com/AlloyTeam/omi\r\n MIT Licensed."),
new webpack.NoErrorsPlugin()
],
stats: {

View File

@ -1,4 +1,5 @@
import Omi from '../../src/index.js';
import config from '../js/config.js';
function getMarkDown(name,lan) {
let md = require("md-text!../../docs/" + lan + "_" + name + ".md");
@ -20,7 +21,7 @@ class Content extends Omi.Component {
}
install() {
this.data.html = marked(getMarkDownByArr(['installation', 'hello_world', 'components', 'communication', 'lifecycle', 'events', 'condition', 'loop', 'form', 'inherit', 'template', 'thinking_in_omi'], 'cn'));
this.data.html = marked(getMarkDownByArr(config.mds, 'cn'));
}
style () {

View File

@ -2,6 +2,7 @@ import Omi from '../../src/index.js';
import Content from './content.js';
import Sidebar from './sidebar.js';
import Head from './head.js';
import config from '../js/config.js';
Omi.makeHTML('Content', Content);
Omi.makeHTML('Sidebar', Sidebar);
@ -55,18 +56,17 @@ class Frame extends Omi.Component {
// so textContent
var html = Prism.highlight(codes[i].textContent, Prism.languages.javascript);
codes[i].innerHTML = html;
codes[i].classList.add('language-js');
}
//1,5-6,8
let mapping = {3: '6', 6: '5', 9: '3,9,34', 19: '22', 22: '6-12'}
let pres = document.querySelectorAll("pre");
for (let key in mapping) {
pres[key].setAttribute("data-line", mapping[key]);
let highlight = config.highlight;
for (let key in config.highlight) {
pres[key].setAttribute("data-line", highlight[key]);
}
this._$$('pre').forEach((item)=> {
item.classList.add('language-js');
})

View File

@ -1,5 +1,6 @@
import Omi from '../../src/index.js';
import List from './list.js';
import config from '../js/config.js';
Omi.makeHTML('List', List);
@ -9,52 +10,7 @@ class Sidebar extends Omi.Component {
}
install () {
if(this.data.lan==="cn") {
this.data.items = [
{title: "快速开始", list: [
{"name": "安装"},
{"name": "Hello World"},
{"name": "组件"},
{"name": "组件通讯"},
{"name": "生命周期"},
{"name": "事件处理"},
{"name": "条件判断"},
{"name": "循环遍历"},
{"name": "表单"},
{"name": "继承"},
//{"name": "容器系统"},
{"name": "模板切换"},
//{"name": "服务器端渲染"},
{"name": "Omi的理念"}
]},
{title: "Omi原理", list: [
{"name": "未完待续"},
{"name": "..."},
{"name": "..."},
{"name": "..."}
]}
];
}else{
this.data.items = [
{title: "QUICK START", list: [
{"name": "Installation"},
{"name": "Hello World"},
{"name": "Components"},
{"name": "Lifecycle"},
{"name": "Handling Events"},
{"name": "Conditional Rendering"},
{"name": "Lists and Keys"},
{"name": "Forms"},
{"name": "Inheritance"},
{"name": "Sever-side Rendering"},
{"name": "Thinking In Omi"}
]},
{title: "Omi's Principle", list: [ {"name": "Scroped CSS"}]}
];
}
this.data.items = config[this.data.lan+'_menus'] ;
this.data.height = window.innerHeight -45;
this.childrenData = this.data.items;
}

View File

@ -74,14 +74,18 @@
var _content2 = _interopRequireDefault(_content);
var _sidebar = __webpack_require__(26);
var _sidebar = __webpack_require__(29);
var _sidebar2 = _interopRequireDefault(_sidebar);
var _head = __webpack_require__(28);
var _head = __webpack_require__(31);
var _head2 = _interopRequireDefault(_head);
var _config = __webpack_require__(10);
var _config2 = _interopRequireDefault(_config);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@ -147,18 +151,17 @@
// so textContent
var html = Prism.highlight(codes[i].textContent, Prism.languages.javascript);
codes[i].innerHTML = html;
codes[i].classList.add('language-js');
}
//1,5-6,8
var mapping = { 3: '6', 6: '5', 9: '3,9,34', 19: '22', 22: '6-12' };
var pres = document.querySelectorAll("pre");
for (var key in mapping) {
pres[key].setAttribute("data-line", mapping[key]);
var highlight = _config2.default.highlight;
for (var key in _config2.default.highlight) {
pres[key].setAttribute("data-line", highlight[key]);
}
this._$$('pre').forEach(function (item) {
item.classList.add('language-js');
});
@ -1037,13 +1040,13 @@
this.renderTo = typeof data === "string" ? document.querySelector(data) : data;
this._hidden = this.renderTo.querySelector('.omi_scoped__hidden_data');
this.id = this._hidden.dataset.omiId;
this.data = JSON.parse(this._hidden.value);
this.data = this._data = JSON.parse(this._hidden.value);
} else {
this.data = data || {};
this.data = this._data = data || {};
this._omi_server_rendering = server;
this.id = _omi2.default.getInstanceId();
this.refs = {};
this.id = this._omi_server_rendering ? 1000000 + _omi2.default.getInstanceId() : _omi2.default.getInstanceId();
}
this.refs = {};
this.children = [];
this.childrenData = [];
this.HTML = null;
@ -1351,7 +1354,7 @@
key: '_mergeData',
value: function _mergeData(childStr, isFirst) {
var arr = childStr.match(/\s*data=['|"](\S*)['|"]/);
this.data = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this.data);
this.data = Object.assign({}, this._getDataset(childStr), arr ? this.parent[RegExp.$1] : null, this._data);
isFirst && this.install();
}
}, {
@ -1754,7 +1757,7 @@
/* 9 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
@ -1766,6 +1769,10 @@
var _index2 = _interopRequireDefault(_index);
var _config = __webpack_require__(10);
var _config2 = _interopRequireDefault(_config);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@ -1775,7 +1782,7 @@
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function getMarkDown(name, lan) {
var md = __webpack_require__(10)("./" + lan + "_" + name + ".md");
var md = __webpack_require__(11)("./" + lan + "_" + name + ".md");
return md.substring(0, md.length - 1).replace(/\\r\\n/g, "\r\n").replace(/\\n/g, "\n").replace(/\\t/g, "\t").replace('module.exports = "', "").replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
@ -1798,19 +1805,19 @@
}
_createClass(Content, [{
key: "install",
key: 'install',
value: function install() {
this.data.html = marked(getMarkDownByArr(['installation', 'hello_world', 'components', 'communication', 'lifecycle', 'events', 'condition', 'loop', 'form', 'inherit', 'template', 'thinking_in_omi'], 'cn'));
this.data.html = marked(getMarkDownByArr(_config2.default.mds, 'cn'));
}
}, {
key: "style",
key: 'style',
value: function style() {
return "\n .content{\n width: 80%;\n }\n h2{\n padding-top:20px;\n }\n h3{\n color:#444444;\n }\n pre{\n border: 1px solid #eee;\n width: 100%;\n }\n li{\n text-indent: 20px;\n list-style:disc inside ;\n }\n ";
return '\n .content{\n width: 80%;\n }\n h2{\n padding-top:20px;\n }\n h3{\n color:#444444;\n }\n pre{\n border: 1px solid #eee;\n width: 100%;\n }\n li{\n text-indent: 20px;\n list-style:disc inside ;\n }\n ';
}
}, {
key: "render",
key: 'render',
value: function render() {
return "\n <div class=\"content\">\n {{{html}}}\n </div>\n ";
return '\n <div class="content">\n {{{html}}}\n </div>\n ';
}
}]);
@ -1821,24 +1828,50 @@
/***/ },
/* 10 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var config = {
//1,5-6,8
highlight: { 3: '6', 6: '5', 9: '3,9,34', 19: '22', 22: '6-12', 33: '13,18' },
mds: ['installation', 'hello_world', 'components', 'communication', 'lifecycle', 'events', 'condition', 'loop', 'form', 'inherit', 'template', 'get_dom', 'thinking_in_omi'],
cn_menus: [{ title: "快速开始", list: [{ "name": "安装" }, { "name": "Hello World" }, { "name": "组件" }, { "name": "组件通讯" }, { "name": "生命周期" }, { "name": "事件处理" }, { "name": "条件判断" }, { "name": "循环遍历" }, { "name": "表单" }, { "name": "继承" },
//{"name": "容器系统"},
{ "name": "模板切换" }, { "name": "获取DOM节点" },
//{"name": "服务器端渲染"},
{ "name": "Omi的理念" }] }, { title: "Omi原理", list: [{ "name": "未完待续" }, { "name": "..." }, { "name": "..." }, { "name": "..." }] }],
en_menu: [{ title: "QUICK START", list: [{ "name": "Installation" }, { "name": "Hello World" }, { "name": "Components" }, { "name": "Lifecycle" }, { "name": "Handling Events" }, { "name": "Conditional Rendering" }, { "name": "Lists and Keys" }, { "name": "Forms" }, { "name": "Inheritance" }, { "name": "Sever-side Rendering" }, { "name": "Thinking In Omi" }] }, { title: "Principle of Omi", list: [{ "name": "Scoped CSS" }] }]
};
exports.default = config;
/***/ },
/* 11 */
/***/ function(module, exports, __webpack_require__) {
var map = {
"./README.md": 11,
"./cn_communication.md": 12,
"./cn_components.md": 13,
"./cn_condition.md": 14,
"./cn_events.md": 15,
"./cn_form.md": 16,
"./cn_hello_world.md": 17,
"./cn_inherit.md": 18,
"./cn_installation.md": 19,
"./cn_lifecycle.md": 20,
"./cn_loop.md": 21,
"./cn_template.md": 22,
"./cn_thinking_in_omi.md": 23,
"./en_hello_world.md": 24,
"./en_installation.md": 25
"./README.md": 12,
"./cn_communication.md": 13,
"./cn_components.md": 14,
"./cn_condition.md": 15,
"./cn_events.md": 16,
"./cn_form.md": 17,
"./cn_get_dom.md": 18,
"./cn_hello_world.md": 19,
"./cn_inherit.md": 20,
"./cn_installation.md": 21,
"./cn_lifecycle.md": 22,
"./cn_loop.md": 23,
"./cn_pr_env.md": 24,
"./cn_template.md": 25,
"./cn_thinking_in_omi.md": 26,
"./en_hello_world.md": 27,
"./en_installation.md": 28
};
function webpackContext(req) {
return __webpack_require__(webpackContextResolve(req));
@ -1851,101 +1884,113 @@
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = 10;
webpackContext.id = 11;
/***/ },
/* 11 */
/***/ function(module, exports) {
module.exports = "module.exports = \"# Omi使用文档\\r\\n* [安装](./cn_installation.md)\\r\\n* [Hello World](./cn_hello_world.md)\\r\\n* [组件](./cn_components.md)\\r\\n* [组件通讯](./cn_communication.md)\\r\\n* [生命周期](./cn_lifecycle.md)\\r\\n* [事件处理](./cn_events.md)\\r\\n* [条件判断](./cn_condition.md)\\r\\n* [循环遍历](./cn_loop.md)\\r\\n* [表单](./cn_form.md)\\r\\n* [继承](./cn_inhrit.md)\\r\\n* [模板切换](./cn_template.md)\\r\\n* [Omi理念](./cn_thinking_in_omi.md)\\r\\n\\r\\n# 从零一步步打造Web组件化框架Omi\\r\\n\\r\\n待续...\\r\\n\\r\\n* 局部CSS揭秘\\r\\n* 组件嵌套揭秘\\r\\n* 事件处理揭秘\\r\\n* 服务器端渲染揭秘\\r\\n* 模板切换揭秘\\r\\n* 容器系统揭秘\""
/***/ },
/* 12 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"组件通讯\\\">组件通讯</h2>\\r\\n\\r\\n使用Omi其实没有组件通讯的概念因为\\r\\n\\r\\n* 通过在子节点上声明 data-* 或者声明 data 传递给子节点 \\r\\n* 父容器设置childrenData自动传递给子节点\\r\\n* 完全面向对象,可以非常容易地拿到对象的实例,之后可以设置实例属性和调用实例的方法\\r\\n\\r\\n所以通讯变得畅通无阻下面一一来举例说明。\\r\\n\\r\\n### data-*或者data通讯 \\r\\n\\r\\n```js\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n h1{\\r\\n \\tcursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target, evt){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n \\t<h1 onclick=\\\"handleClick(this, event)\\\">Hello ,{{name}}!</h1>\\r\\n </div>\\r\\n \\t\\t`;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.makeHTML('Hello', Hello);\\r\\n\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello data-name=\\\"Omi\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n如上面代码所示通过 data-name=\\\"Omi\\\"可以把name传递给子组件。下面的代码也可以达到同样的效果。\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n this.helloData = { name : 'Omi' };\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello data=\\\"helloData\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n还可以使用childrenData的方式。\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n this.childrenData = [{ name : 'Omi' }];\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n### 设置对象实例\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n \\r\\n installed(){\\r\\n this.hello.data.name = \\\"Omi\\\";\\r\\n this.update()\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello name=\\\"hello\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n也可以通过设置omi-id在程序任何地方拿到该对象的实例。如\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n \\r\\n installed(){\\r\\n Omi.get(\\\"hello\\\").data.name = \\\"Omi\\\";\\r\\n this.update()\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello omi-id=\\\"hello\\\" />\\r\\n </div>\\r\\n `;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\""
module.exports = "module.exports = \"# Omi使用文档\\r\\n* [安装](./cn_installation.md)\\r\\n* [Hello World](./cn_hello_world.md)\\r\\n* [组件](./cn_components.md)\\r\\n* [组件通讯](./cn_communication.md)\\r\\n* [生命周期](./cn_lifecycle.md)\\r\\n* [事件处理](./cn_events.md)\\r\\n* [条件判断](./cn_condition.md)\\r\\n* [循环遍历](./cn_loop.md)\\r\\n* [表单](./cn_form.md)\\r\\n* [继承](./cn_inhrit.md)\\r\\n* [模板切换](./cn_template.md)\\r\\n* [Omi理念](./cn_thinking_in_omi.md)\\r\\n\\r\\n# 从零一步步打造Web组件化框架Omi\\r\\n\\r\\n待续...\\r\\n\\r\\n* 局部CSS揭秘\\r\\n* 组件嵌套揭秘\\r\\n* 事件处理揭秘\\r\\n* 服务器端渲染揭秘\\r\\n* 模板切换揭秘\\r\\n* 容器系统揭秘\""
/***/ },
/* 13 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"组件\\\">组件</h2>\\r\\n\\r\\n我们希望开发者可以像搭积木一样制作Web程序所以一切皆组件。\\r\\n\\r\\n### 简单组件\\r\\n\\r\\n这里我们使用Todo的例子来讲解Omi组件体系的使用。\\r\\n\\r\\n```js\\r\\nclass Todo extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n add (evt) {\\r\\n evt.preventDefault();\\r\\n this.data.items.push(this.data.text);\\r\\n this.data.text = '';\\r\\n this.update();\\r\\n }\\r\\n\\r\\n style () {\\r\\n return `\\r\\n h3 { color:red; }\\r\\n button{ color:green;}\\r\\n `;\\r\\n }\\r\\n\\r\\n handleChange(target){\\r\\n this.data.text = target.value;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <h3>TODO</h3>\\r\\n <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>\\r\\n <form onsubmit=\\\"add(event)\\\" >\\r\\n <input type=\\\"text\\\" onchange=\\\"handleChange(this)\\\" value=\\\"{{text}}\\\" />\\r\\n <button>Add #{{items.length}}</button>\\r\\n </form>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new Todo({ items: [] ,text : '' }),\\\"body\\\");\\r\\n```\\r\\n\\r\\n组件生成的HTML最终会插入到body中。上面的例子展示了Omi的部分特性:\\r\\n\\r\\n- data传递: new Todo(data,..)的data可以直接提供给render方法里的模板\\r\\n- 局部CSS: h3只对render里的h3生效不会污染外面的h3button也是同样的\\r\\n- 声明式事件绑定: onchange调用的就是组件内的handleChangethis可以拿到当然的DOM元素,还可以拿到当前的event\\r\\n- 需要手动调用update方法才能更新组件\\r\\n\\r\\n这里需要特别强调的是为了更加的自由和灵活度。Omi没有内置数据变更的自动更新需要开发者自己调用update方法。\\r\\n你也可以和[oba](https://github.com/kmdjs/oba)或者mobx一起使用来实现自动更新。\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=todo)\\r\\n\\r\\n### 组件嵌套\\r\\n\\r\\n几乎所有的Web网页或者Web应用我们需要嵌套我们定义的组件来完成所有的功能和展示。比如上面的Todo我们也是可以抽取出List。\\r\\n这样有什么好处易维护、可扩展、方便复用。如我们抽取去List\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n怎么使用这个List\\r\\n\\r\\n```js\\r\\nimport List from './list.js';\\r\\n\\r\\nOmi.makeHTML('List', List);\\r\\n\\r\\nclass Todo extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n this.data.length = this.data.items.length;\\r\\n this.childrenData = [ { items : this.data.items } ];\\r\\n }\\r\\n\\r\\n add (evt) {\\r\\n evt.preventDefault();\\r\\n this.list.data.items.push(this.data.text);\\r\\n this.data.length = this.list.data.items.length;\\r\\n this.data.text = '';\\r\\n this.update();\\r\\n }\\r\\n\\r\\n style () {\\r\\n return `\\r\\n h3 { color:red; }\\r\\n button{ color:green;}\\r\\n `;\\r\\n }\\r\\n\\r\\n handleChange(target){\\r\\n this.data.text = target.value;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <h3>TODO</h3>\\r\\n <List omi-id=\\\"list\\\" name=\\\"list\\\" />\\r\\n <form onsubmit=\\\"add(event)\\\" >\\r\\n <input type=\\\"text\\\" onchange=\\\"handleChange(this)\\\" value=\\\"{{text}}\\\" />\\r\\n <button>Add #{{length}}</button>\\r\\n </form>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n* 第3行通过makeHTML方法把组件制作成可以在render中使用的标签。当然Omi.makeHTML('List', List);也可以写在List组件的代码下面。\\r\\n* 第9行通过设置this.childrenData可以把参数传递给子组件。this.childrenData是个数组这样就支持多child的情况。\\r\\n* 第36行在render方法中使用List组件。其中name方法可以让你在代码里通过this快速方法到该组件的实例。omi-id可以让你通过Omi.mapping['list']快速访问到组件对象的实例。\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=todo_nest)\""
module.exports = "module.exports = \"<h2 id=\\\"组件通讯\\\">组件通讯</h2>\\r\\n\\r\\n使用Omi其实没有组件通讯的概念因为\\r\\n\\r\\n* 通过在子节点上声明 data-* 或者声明 data 传递给子节点 \\r\\n* 父容器设置childrenData自动传递给子节点\\r\\n* 完全面向对象,可以非常容易地拿到对象的实例,之后可以设置实例属性和调用实例的方法\\r\\n\\r\\n所以通讯变得畅通无阻下面一一来举例说明。\\r\\n\\r\\n### data-*或者data通讯 \\r\\n\\r\\n```js\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n h1{\\r\\n \\tcursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target, evt){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n \\t<h1 onclick=\\\"handleClick(this, event)\\\">Hello ,{{name}}!</h1>\\r\\n </div>\\r\\n \\t\\t`;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.makeHTML('Hello', Hello);\\r\\n\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello data-name=\\\"Omi\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n如上面代码所示通过 data-name=\\\"Omi\\\"可以把name传递给子组件。下面的代码也可以达到同样的效果。\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n this.helloData = { name : 'Omi' };\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello data=\\\"helloData\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n还可以使用childrenData的方式。\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n this.childrenData = [{ name : 'Omi' }];\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n### 设置对象实例\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n \\r\\n installed(){\\r\\n this.hello.data.name = \\\"Omi\\\";\\r\\n this.update()\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello name=\\\"hello\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n也可以通过设置omi-id在程序任何地方拿到该对象的实例。如\\r\\n\\r\\n```js\\r\\n...\\r\\nclass App extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n \\r\\n installed(){\\r\\n Omi.get(\\\"hello\\\").data.name = \\\"Omi\\\";\\r\\n this.update()\\r\\n }\\r\\n \\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <Hello omi-id=\\\"hello\\\" />\\r\\n </div>\\r\\n `;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new App(),\\\"#container\\\");\\r\\n```\""
/***/ },
/* 14 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"条件判断\\\">条件判断</h2>\\r\\n\\r\\n我们经常需要根据不同的状态呈现不同的界面比如有的用户是vip要显示vip的Logo。Omi有许多种方式满足你的要求。\\r\\n\\r\\n### 方式一\\r\\n\\r\\n```js\\r\\nclass ConditionTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `{{#isVip}}\\r\\n <div>you are VIP.</div>\\r\\n {{/isVip}}\\r\\n {{^isVip}}\\r\\n <div>you are not VIP.</div>\\r\\n {{/isVip}}`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n上面完全使用mustachejs的条件判断的语法。当然Omi不强制你使用mustachejs。你可以是omi.lite.js然后重写Omi.template方法去使用任意你喜爱的模板引擎。\\r\\n\\r\\n### 方式二\\r\\n\\r\\n```js\\r\\nclass ConditionTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n if(this.data.isVip){\\r\\n return '<div>you are VIP.</div>';\\r\\n }else{\\r\\n return '<div>you are not VIP.</div>';\\r\\n }\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\nrender就是提供了很好的可编程性里面可以写任意js逻辑代码。对了差点忘了style方法里面也可以写js逻辑的。\\r\\n\\r\\n```js\\r\\nclass ConditionTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n style (){\\r\\n if(this.data.isVip){\\r\\n return 'div{ color : red; }';\\r\\n }else{\\r\\n return 'div{ color : green; }';\\r\\n }\\r\\n }\\r\\n\\r\\n render () {\\r\\n if(this.data.isVip){\\r\\n return '<div>you are VIP.</div>';\\r\\n }else{\\r\\n return '<div>you are not VIP.</div>';\\r\\n }\\r\\n }\\r\\n}\\r\\n```\""
module.exports = "module.exports = \"<h2 id=\\\"组件\\\">组件</h2>\\r\\n\\r\\n我们希望开发者可以像搭积木一样制作Web程序所以一切皆组件。\\r\\n\\r\\n### 简单组件\\r\\n\\r\\n这里我们使用Todo的例子来讲解Omi组件体系的使用。\\r\\n\\r\\n```js\\r\\nclass Todo extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n add (evt) {\\r\\n evt.preventDefault();\\r\\n this.data.items.push(this.data.text);\\r\\n this.data.text = '';\\r\\n this.update();\\r\\n }\\r\\n\\r\\n style () {\\r\\n return `\\r\\n h3 { color:red; }\\r\\n button{ color:green;}\\r\\n `;\\r\\n }\\r\\n\\r\\n handleChange(target){\\r\\n this.data.text = target.value;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <h3>TODO</h3>\\r\\n <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>\\r\\n <form onsubmit=\\\"add(event)\\\" >\\r\\n <input type=\\\"text\\\" onchange=\\\"handleChange(this)\\\" value=\\\"{{text}}\\\" />\\r\\n <button>Add #{{items.length}}</button>\\r\\n </form>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new Todo({ items: [] ,text : '' }),\\\"body\\\");\\r\\n```\\r\\n\\r\\n组件生成的HTML最终会插入到body中。上面的例子展示了Omi的部分特性:\\r\\n\\r\\n- data传递: new Todo(data,..)的data可以直接提供给render方法里的模板\\r\\n- 局部CSS: h3只对render里的h3生效不会污染外面的h3button也是同样的\\r\\n- 声明式事件绑定: onchange调用的就是组件内的handleChangethis可以拿到当然的DOM元素,还可以拿到当前的event\\r\\n- 需要手动调用update方法才能更新组件\\r\\n\\r\\n这里需要特别强调的是为了更加的自由和灵活度。Omi没有内置数据变更的自动更新需要开发者自己调用update方法。\\r\\n你也可以和[oba](https://github.com/kmdjs/oba)或者mobx一起使用来实现自动更新。\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=todo)\\r\\n\\r\\n### 组件嵌套\\r\\n\\r\\n几乎所有的Web网页或者Web应用我们需要嵌套我们定义的组件来完成所有的功能和展示。比如上面的Todo我们也是可以抽取出List。\\r\\n这样有什么好处易维护、可扩展、方便复用。如我们抽取去List\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n怎么使用这个List\\r\\n\\r\\n```js\\r\\nimport List from './list.js';\\r\\n\\r\\nOmi.makeHTML('List', List);\\r\\n\\r\\nclass Todo extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n this.data.length = this.data.items.length;\\r\\n this.childrenData = [ { items : this.data.items } ];\\r\\n }\\r\\n\\r\\n add (evt) {\\r\\n evt.preventDefault();\\r\\n this.list.data.items.push(this.data.text);\\r\\n this.data.length = this.list.data.items.length;\\r\\n this.data.text = '';\\r\\n this.update();\\r\\n }\\r\\n\\r\\n style () {\\r\\n return `\\r\\n h3 { color:red; }\\r\\n button{ color:green;}\\r\\n `;\\r\\n }\\r\\n\\r\\n handleChange(target){\\r\\n this.data.text = target.value;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <h3>TODO</h3>\\r\\n <List omi-id=\\\"list\\\" name=\\\"list\\\" />\\r\\n <form onsubmit=\\\"add(event)\\\" >\\r\\n <input type=\\\"text\\\" onchange=\\\"handleChange(this)\\\" value=\\\"{{text}}\\\" />\\r\\n <button>Add #{{length}}</button>\\r\\n </form>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n* 第3行通过makeHTML方法把组件制作成可以在render中使用的标签。当然Omi.makeHTML('List', List);也可以写在List组件的代码下面。\\r\\n* 第9行通过设置this.childrenData可以把参数传递给子组件。this.childrenData是个数组这样就支持多child的情况。\\r\\n* 第36行在render方法中使用List组件。其中name方法可以让你在代码里通过this快速方法到该组件的实例。omi-id可以让你通过Omi.mapping['list']快速访问到组件对象的实例。\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=todo_nest)\""
/***/ },
/* 15 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"事件处理\\\">事件处理</h2>\\r\\n\\r\\nOmi的事件分内置事件和自定义事件。在内置事件处理方面巧妙地利用了浏览器自身的管线机制可以通过event和this轻松拿到事件实例和触发该事件的元素。\\r\\n\\r\\n### 内置事件\\r\\n\\r\\n什么算内置事件只要下面正则能匹配到就算内置事件。\\r\\n\\r\\n```js\\r\\non(abort|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|dblclick|drag|dragend|dragenter|dragleave|dragover|dragstart|drop|durationchange|emptied|ended|error|focus|input|invalid|keydown|keypress|keyup|load|loadeddata|loadedmetadata|loadstart|mousedown|mouseenter|mouseleave|mousemove|mouseout|mouseover|mouseup|mousewheel|pause|play|playing|progress|ratechange|reset|resize|scroll|seeked|seeking|select|show|stalled|submit|suspend|timeupdate|toggle|volumechange|waiting|autocomplete|autocompleteerror|beforecopy|beforecut|beforepaste|copy|cut|paste|search|selectstart|wheel|webkitfullscreenchange|webkitfullscreenerror|touchstart|touchmove|touchend|touchcancel|pointerdown|pointerup|pointercancel|pointermove|pointerover|pointerout|pointerenter|pointerleave)\\r\\n```\\r\\n\\r\\n内置事件怎么绑定如下所示\\r\\n\\r\\n```js\\r\\nclass EventTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n handleClick(dom, evt){\\r\\n alert(dom.innerHTML);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div onclick=\\\"handleClick(this, event)\\\">Hello, Omi!</div>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n### 自定义事件\\r\\n\\r\\n开发者自己定义的组件的事件称为自定义事件。这里拿分页作为例子\\r\\n\\r\\n```js\\r\\nimport Omi from '../../src/index.js';\\r\\nimport Pagination from './pagination.js';\\r\\nimport Content from './content.js';\\r\\n\\r\\nOmi.makeHTML('Pagination', Pagination);\\r\\nOmi.makeHTML('Content', Content);\\r\\n\\r\\nclass Main extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n installed(){\\r\\n this.content.goto(this.pagination.data.currentPage+1);\\r\\n }\\r\\n handlePageChange(index){\\r\\n this.content.goto(index+1);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <h1>Pagination Example</h1>\\r\\n <Content name=\\\"content\\\" />\\r\\n <Pagination\\r\\n name=\\\"pagination\\\"\\r\\n data-total=\\\"100\\\"\\r\\n data-page-size=\\\"10\\\"\\r\\n data-num-edge=\\\"1\\\"\\r\\n data-num-display=\\\"4\\\"     \\r\\n onPageChange=\\\"handlePageChange\\\" />\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render( new Main(),'body');\\r\\n```\\r\\n\\r\\n如上面的onPageChange就是自定义事件触发会执行handlePageChange。onPageChange方法是在Pagination中执行\\r\\n\\r\\n```js\\r\\nimport Omi from '../../src/index.js';\\r\\n\\r\\nclass Pagination extends Omi.Component {\\r\\n ...\\r\\n ...\\r\\n ...\\r\\n linkTo: \\\"#\\\",\\r\\n prevText: \\\"Prev\\\",\\r\\n nextText: \\\"Next\\\",\\r\\n ellipseText: \\\"...\\\",\\r\\n prevShow: true,\\r\\n nextShow: true,\\r\\n onPageChange: function () { return false; }\\r\\n }, this.data);\\r\\n\\r\\n this.pageNum = Math.ceil(this.data.total / this.data.pageSize);\\r\\n }\\r\\n goto (index,evt) {\\r\\n evt.preventDefault();\\r\\n this.data.currentPage=index;\\r\\n this.update();\\r\\n this.data.onPageChange(index);\\r\\n }\\r\\n ...\\r\\n ...\\r\\n ...\\r\\n}\\r\\n```\\r\\n\\r\\n这里取了Pagination组件的部分代码。高亮的就是执行onPageChange的地方。\\r\\n\\r\\n### 相关地址\\r\\n\\r\\n* [演示地址](http://alloyteam.github.io/omi/example/pagination/)\\r\\n* [源码地址](https://github.com/AlloyTeam/omi/tree/master/example/pagination)\""
module.exports = "module.exports = \"<h2 id=\\\"条件判断\\\">条件判断</h2>\\r\\n\\r\\n我们经常需要根据不同的状态呈现不同的界面比如有的用户是vip要显示vip的Logo。Omi有许多种方式满足你的要求。\\r\\n\\r\\n### 方式一\\r\\n\\r\\n```js\\r\\nclass ConditionTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `{{#isVip}}\\r\\n <div>you are VIP.</div>\\r\\n {{/isVip}}\\r\\n {{^isVip}}\\r\\n <div>you are not VIP.</div>\\r\\n {{/isVip}}`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n上面完全使用mustachejs的条件判断的语法。当然Omi不强制你使用mustachejs。你可以是omi.lite.js然后重写Omi.template方法去使用任意你喜爱的模板引擎。\\r\\n\\r\\n### 方式二\\r\\n\\r\\n```js\\r\\nclass ConditionTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n if(this.data.isVip){\\r\\n return '<div>you are VIP.</div>';\\r\\n }else{\\r\\n return '<div>you are not VIP.</div>';\\r\\n }\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\nrender就是提供了很好的可编程性里面可以写任意js逻辑代码。对了差点忘了style方法里面也可以写js逻辑的。\\r\\n\\r\\n```js\\r\\nclass ConditionTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n style (){\\r\\n if(this.data.isVip){\\r\\n return 'div{ color : red; }';\\r\\n }else{\\r\\n return 'div{ color : green; }';\\r\\n }\\r\\n }\\r\\n\\r\\n render () {\\r\\n if(this.data.isVip){\\r\\n return '<div>you are VIP.</div>';\\r\\n }else{\\r\\n return '<div>you are not VIP.</div>';\\r\\n }\\r\\n }\\r\\n}\\r\\n```\""
/***/ },
/* 16 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"表单\\\">表单</h2>\\r\\n\\r\\nOmi让一些表单操控起来更加方便特别是select\\r\\n\\r\\n### select标签\\r\\n\\r\\n以前我们需要像如下的方式选中一个选项\\r\\n\\r\\n```html\\r\\n<select>\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option selected value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n</select>\\r\\n```\\r\\n\\r\\n第三个option由于加上了selected所有会被选中。这样带来的问题就是开发者写的程序可能要操遍历每个option。而使用Omi你只需要这样子\\r\\n\\r\\n```html\\r\\n<select value=\\\"coconut\\\">\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n</select>\\r\\n```\\r\\n\\r\\n这样就能达到同样的效果。比如你想选择第一项\\r\\n\\r\\n```html\\r\\n<select value=\\\"grapefruit\\\">\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n</select>\\r\\n```\\r\\n\\r\\n是不是非常方便\\r\\n\\r\\n### 举个例子\\r\\n\\r\\n```js\\r\\nclass FormTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n \\r\\n }\\r\\n\\r\\n handleChange(target){\\r\\n console.log(target.value)\\r\\n this.data.value = target.value;\\r\\n }\\r\\n\\r\\n handleSubmit(evt) {\\r\\n alert('Your favorite flavor is: ' + this.data.value);\\r\\n evt.preventDefault();\\r\\n }\\r\\n \\r\\n render () {\\r\\n return `\\r\\n <form onsubmit=\\\"handleSubmit(event)\\\">\\r\\n <label>\\r\\n Pick your favorite La Croix flavor:\\r\\n <select value=\\\"{{value}}\\\" onchange=\\\"handleChange(this)\\\">\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n </select>\\r\\n </label>\\r\\n <input type=\\\"submit\\\" value=\\\"Submit\\\" />\\r\\n </form>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new FormTest({ value: 'mango' }),'#container');\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=form)\""
module.exports = "module.exports = \"<h2 id=\\\"事件处理\\\">事件处理</h2>\\r\\n\\r\\nOmi的事件分内置事件和自定义事件。在内置事件处理方面巧妙地利用了浏览器自身的管线机制可以通过event和this轻松拿到事件实例和触发该事件的元素。\\r\\n\\r\\n### 内置事件\\r\\n\\r\\n什么算内置事件只要下面正则能匹配到就算内置事件。\\r\\n\\r\\n```js\\r\\non(abort|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|dblclick|drag|dragend|dragenter|dragleave|dragover|dragstart|drop|durationchange|emptied|ended|error|focus|input|invalid|keydown|keypress|keyup|load|loadeddata|loadedmetadata|loadstart|mousedown|mouseenter|mouseleave|mousemove|mouseout|mouseover|mouseup|mousewheel|pause|play|playing|progress|ratechange|reset|resize|scroll|seeked|seeking|select|show|stalled|submit|suspend|timeupdate|toggle|volumechange|waiting|autocomplete|autocompleteerror|beforecopy|beforecut|beforepaste|copy|cut|paste|search|selectstart|wheel|webkitfullscreenchange|webkitfullscreenerror|touchstart|touchmove|touchend|touchcancel|pointerdown|pointerup|pointercancel|pointermove|pointerover|pointerout|pointerenter|pointerleave)\\r\\n```\\r\\n\\r\\n内置事件怎么绑定如下所示\\r\\n\\r\\n```js\\r\\nclass EventTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n handleClick(dom, evt){\\r\\n alert(dom.innerHTML);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div onclick=\\\"handleClick(this, event)\\\">Hello, Omi!</div>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n### 自定义事件\\r\\n\\r\\n开发者自己定义的组件的事件称为自定义事件。这里拿分页作为例子\\r\\n\\r\\n```js\\r\\nimport Omi from '../../src/index.js';\\r\\nimport Pagination from './pagination.js';\\r\\nimport Content from './content.js';\\r\\n\\r\\nOmi.makeHTML('Pagination', Pagination);\\r\\nOmi.makeHTML('Content', Content);\\r\\n\\r\\nclass Main extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n installed(){\\r\\n this.content.goto(this.pagination.data.currentPage+1);\\r\\n }\\r\\n handlePageChange(index){\\r\\n this.content.goto(index+1);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <h1>Pagination Example</h1>\\r\\n <Content name=\\\"content\\\" />\\r\\n <Pagination\\r\\n name=\\\"pagination\\\"\\r\\n data-total=\\\"100\\\"\\r\\n data-page-size=\\\"10\\\"\\r\\n data-num-edge=\\\"1\\\"\\r\\n data-num-display=\\\"4\\\"     \\r\\n onPageChange=\\\"handlePageChange\\\" />\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render( new Main(),'body');\\r\\n```\\r\\n\\r\\n如上面的onPageChange就是自定义事件触发会执行handlePageChange。onPageChange方法是在Pagination中执行\\r\\n\\r\\n```js\\r\\nimport Omi from '../../src/index.js';\\r\\n\\r\\nclass Pagination extends Omi.Component {\\r\\n ...\\r\\n ...\\r\\n ...\\r\\n linkTo: \\\"#\\\",\\r\\n prevText: \\\"Prev\\\",\\r\\n nextText: \\\"Next\\\",\\r\\n ellipseText: \\\"...\\\",\\r\\n prevShow: true,\\r\\n nextShow: true,\\r\\n onPageChange: function () { return false; }\\r\\n }, this.data);\\r\\n\\r\\n this.pageNum = Math.ceil(this.data.total / this.data.pageSize);\\r\\n }\\r\\n goto (index,evt) {\\r\\n evt.preventDefault();\\r\\n this.data.currentPage=index;\\r\\n this.update();\\r\\n this.data.onPageChange(index);\\r\\n }\\r\\n ...\\r\\n ...\\r\\n ...\\r\\n}\\r\\n```\\r\\n\\r\\n这里取了Pagination组件的部分代码。高亮的就是执行onPageChange的地方。\\r\\n\\r\\n### 相关地址\\r\\n\\r\\n* [演示地址](http://alloyteam.github.io/omi/example/pagination/)\\r\\n* [源码地址](https://github.com/AlloyTeam/omi/tree/master/example/pagination)\""
/***/ },
/* 17 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"Hello World\\\">Hello World</h2>\\r\\n\\r\\n你可以使用ES6+或者ES5的方式编写Omi程序来搭建你的Web程序。\\r\\n\\r\\n### Hello World with ES6+\\r\\n\\r\\n你可以使用 [webpack](https://webpack.github.io/) 打包工具webpack会把你的模块代码打成一个很小的包优化加载时间。使用[babel](http://babeljs.io/)让你立刻马上使用ES6+来编写你的web程序。你只需要在webpack配置的module设置好[babel-loader](https://github.com/babel/babel-loader)便可。\\r\\n\\r\\n一个Omi的简短的例子如下所示:\\r\\n\\r\\n```js\\r\\nimport Omi from './omi.js';\\r\\n\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n h1{\\r\\n cursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target, evt){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <h1 onclick=\\\"handleClick(this, event)\\\">Hello ,{{name}}!</h1>\\r\\n </div>\\r\\n `;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new Hello({ name : \\\"Omi\\\" }),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n组件生成的HTML最终会插入到#container中。上面的例子展示了Omi的部分特性:\\r\\n\\r\\n- data传递: new Hello(data,..)的data可以直接提供给render方法里的模板\\r\\n- 局部CSS: h1只对render里的h1生效不会污染外面的h1\\r\\n- 声明式事件绑定: onclick调用的就是组件内的handleClickthis可以拿到当然的DOM元素,还可以拿到当前的event\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=hello)\\r\\n\\r\\n你可以使用Omi.makeHTML来生成组件标签用于嵌套。\\r\\n```js\\r\\n Omi.makeHTML('Hello', Hello);\\r\\n```\\r\\n那么你就在其他组件中使用如\\r\\n```js\\r\\n ...\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <div>Test</div>\\r\\n <Hello data-name=\\\"Omi\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n ...\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=hello_nest)\\r\\n\\r\\n### Hello World with ES5\\r\\n\\r\\n当然Omi没有抛弃ES5的用户。你可以使用ES5的方式编写Omi。如在你的HTML中引用omi.js\\r\\n\\r\\n```html\\r\\n<script src=\\\"omi.js\\\"></script>\\r\\n```\\r\\n\\r\\n然后\\r\\n\\r\\n```js\\r\\nvar Hello = Omi.create(\\\"Hello\\\", {\\r\\n style: function () {\\r\\n return \\\"h1{ cursor:pointer }\\\";\\r\\n },\\r\\n handleClick: function (dom) {\\r\\n alert(dom.innerHTML);\\r\\n },\\r\\n render: function () {\\r\\n return '<div>\\\\\\r\\n <h1 onclick=\\\"handleClick(this, event)\\\">Hello ,{{name}}!</h1>\\\\\\r\\n </div>';\\r\\n }\\r\\n});\\r\\n\\r\\nOmi.render(new Hello({ name : \\\"Omi\\\" }),\\\"#container\\\");\\r\\n```\\r\\n当然除了在HTML引入脚步你还可以使用AMD、CMD或者CommonJS的方式引入Omi这里就不再一一列举。\\r\\n\\r\\n需要注意的是Omi.create的第一个参数Hello是用来生成Tag Name的。你可以在其他地方嵌入你的组件。如\\r\\n\\r\\n```js\\r\\n ...\\r\\n render:function() {\\r\\n return '<div>\\\\\\r\\n <div>Test</div>\\\\\\r\\n <Hello data-name=\\\"Omi\\\" />\\\\\\r\\n </div>';\\r\\n }\\r\\n ...\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=hello_es5)\""
module.exports = "module.exports = \"<h2 id=\\\"表单\\\">表单</h2>\\r\\n\\r\\nOmi让一些表单操控起来更加方便特别是select\\r\\n\\r\\n### select标签\\r\\n\\r\\n以前我们需要像如下的方式选中一个选项\\r\\n\\r\\n```html\\r\\n<select>\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option selected value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n</select>\\r\\n```\\r\\n\\r\\n第三个option由于加上了selected所有会被选中。这样带来的问题就是开发者写的程序可能要操遍历每个option。而使用Omi你只需要这样子\\r\\n\\r\\n```html\\r\\n<select value=\\\"coconut\\\">\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n</select>\\r\\n```\\r\\n\\r\\n这样就能达到同样的效果。比如你想选择第一项\\r\\n\\r\\n```html\\r\\n<select value=\\\"grapefruit\\\">\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n</select>\\r\\n```\\r\\n\\r\\n是不是非常方便\\r\\n\\r\\n### 举个例子\\r\\n\\r\\n```js\\r\\nclass FormTest extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n \\r\\n }\\r\\n\\r\\n handleChange(target){\\r\\n console.log(target.value)\\r\\n this.data.value = target.value;\\r\\n }\\r\\n\\r\\n handleSubmit(evt) {\\r\\n alert('Your favorite flavor is: ' + this.data.value);\\r\\n evt.preventDefault();\\r\\n }\\r\\n \\r\\n render () {\\r\\n return `\\r\\n <form onsubmit=\\\"handleSubmit(event)\\\">\\r\\n <label>\\r\\n Pick your favorite La Croix flavor:\\r\\n <select value=\\\"{{value}}\\\" onchange=\\\"handleChange(this)\\\">\\r\\n <option value=\\\"grapefruit\\\">Grapefruit</option>\\r\\n <option value=\\\"lime\\\">Lime</option>\\r\\n <option value=\\\"coconut\\\">Coconut</option>\\r\\n <option value=\\\"mango\\\">Mango</option>\\r\\n </select>\\r\\n </label>\\r\\n <input type=\\\"submit\\\" value=\\\"Submit\\\" />\\r\\n </form>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new FormTest({ value: 'mango' }),'#container');\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=form)\""
/***/ },
/* 18 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"继承\\\">继承</h2>\\r\\n\\r\\n通过继承机制可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类又称为父类。由已存在的类派生出的新类称为派生类又称为子类。\\r\\n\\r\\n### 举个例子\\r\\n\\r\\n```js\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n div{\\r\\n cursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target, evt){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return ' <div onclick=\\\"handleClick(this,event)\\\">Hello {{name}}!</div>'\\r\\n }\\r\\n}\\r\\n\\r\\nclass SubHello extends Hello {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new SubHello({ name : 'Omi' }),'#container');\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=inherit)\\r\\n\\r\\n### ES5下的继承\\r\\n\\r\\n```js\\r\\nvar Hello = Omi.create(\\\"Hello\\\",{\\r\\n render:function(){\\r\\n return ' <div>Hello {{name}}!</div>'\\r\\n }\\r\\n})\\r\\n\\r\\nvar SubHello = Omi.create(\\\"SubHello\\\",Hello,{ });\\r\\n\\r\\n\\r\\nOmi.render(new SubHello({ name : 'Omi' }),'#container');\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=inherit_es5)\""
module.exports = "module.exports = \"<h2 id=\\\"获取DOM节点\\\">获取DOM节点</h2>\\r\\n\\r\\n虽然绝大部分情况下开发者不需要去查找获取DOM但是还是有需要获取DOM的场景所以Omi提供了方便获取DOM节点的方式。\\r\\n\\r\\n### ref和refs\\r\\n\\r\\n```js\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n h1{\\r\\n cursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(){\\r\\n alert(this.refs.abc.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <h1 ref=\\\"abc\\\" onclick=\\\"handleClick()\\\">Hello ,{{name}}!</h1>\\r\\n </div>\\r\\n `;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new Hello({ name : \\\"Omi\\\" }),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n可以看到通过在HTML中标记ref为abc那么就通过this.refs.abc访问到该DOM节点。\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=ref)\""
/***/ },
/* 19 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"安装\\\">安装</h2>\\n\\nOmi是一款用于创建用户界面的组件化框架开放并且现代故得名Omi。\\n\\n### 安装 Omi\\n\\n我们推荐使用 [npm](https://www.npmjs.com/) 来管理你的前端依赖.\\n\\n通过npm安装Omi你只需要执行下面的命令:\\n\\n``` js\\nnpm install omi\\n```\""
module.exports = "module.exports = \"<h2 id=\\\"Hello World\\\">Hello World</h2>\\r\\n\\r\\n你可以使用ES6+或者ES5的方式编写Omi程序来搭建你的Web程序。\\r\\n\\r\\n### Hello World with ES6+\\r\\n\\r\\n你可以使用 [webpack](https://webpack.github.io/) 打包工具webpack会把你的模块代码打成一个很小的包优化加载时间。使用[babel](http://babeljs.io/)让你立刻马上使用ES6+来编写你的web程序。你只需要在webpack配置的module设置好[babel-loader](https://github.com/babel/babel-loader)便可。\\r\\n\\r\\n一个Omi的简短的例子如下所示:\\r\\n\\r\\n```js\\r\\nimport Omi from './omi.js';\\r\\n\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n h1{\\r\\n cursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target, evt){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <h1 onclick=\\\"handleClick(this, event)\\\">Hello ,{{name}}!</h1>\\r\\n </div>\\r\\n `;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new Hello({ name : \\\"Omi\\\" }),\\\"#container\\\");\\r\\n```\\r\\n\\r\\n组件生成的HTML最终会插入到#container中。上面的例子展示了Omi的部分特性:\\r\\n\\r\\n- data传递: new Hello(data,..)的data可以直接提供给render方法里的模板\\r\\n- 局部CSS: h1只对render里的h1生效不会污染外面的h1\\r\\n- 声明式事件绑定: onclick调用的就是组件内的handleClickthis可以拿到当然的DOM元素,还可以拿到当前的event\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=hello)\\r\\n\\r\\n你可以使用Omi.makeHTML来生成组件标签用于嵌套。\\r\\n```js\\r\\n Omi.makeHTML('Hello', Hello);\\r\\n```\\r\\n那么你就在其他组件中使用如\\r\\n```js\\r\\n ...\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <div>Test</div>\\r\\n <Hello data-name=\\\"Omi\\\" />\\r\\n </div>\\r\\n `;\\r\\n }\\r\\n ...\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=hello_nest)\\r\\n\\r\\n### Hello World with ES5\\r\\n\\r\\n当然Omi没有抛弃ES5的用户。你可以使用ES5的方式编写Omi。如在你的HTML中引用omi.js\\r\\n\\r\\n```html\\r\\n<script src=\\\"omi.js\\\"></script>\\r\\n```\\r\\n\\r\\n然后\\r\\n\\r\\n```js\\r\\nvar Hello = Omi.create(\\\"Hello\\\", {\\r\\n style: function () {\\r\\n return \\\"h1{ cursor:pointer }\\\";\\r\\n },\\r\\n handleClick: function (dom) {\\r\\n alert(dom.innerHTML);\\r\\n },\\r\\n render: function () {\\r\\n return '<div>\\\\\\r\\n <h1 onclick=\\\"handleClick(this, event)\\\">Hello ,{{name}}!</h1>\\\\\\r\\n </div>';\\r\\n }\\r\\n});\\r\\n\\r\\nOmi.render(new Hello({ name : \\\"Omi\\\" }),\\\"#container\\\");\\r\\n```\\r\\n当然除了在HTML引入脚步你还可以使用AMD、CMD或者CommonJS的方式引入Omi这里就不再一一列举。\\r\\n\\r\\n需要注意的是Omi.create的第一个参数Hello是用来生成Tag Name的。你可以在其他地方嵌入你的组件。如\\r\\n\\r\\n```js\\r\\n ...\\r\\n render:function() {\\r\\n return '<div>\\\\\\r\\n <div>Test</div>\\\\\\r\\n <Hello data-name=\\\"Omi\\\" />\\\\\\r\\n </div>';\\r\\n }\\r\\n ...\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=hello_es5)\""
/***/ },
/* 20 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"生命周期\\\">生命周期</h2>\\r\\n\\r\\n\\r\\n| 名称 | 含义 | 时机 |\\r\\n| :-------------: |:-------------:|: -----:|\\r\\n| constructor | 构造函数 | new的时候 |\\r\\n| install | 初始化安装这可以拿到用户传进的data进行处理 | 实例化 |\\r\\n| installed | 安装完成HTML已经插入页面之后执行。注意组件被remove之后再进行restore也会执行 | ** 实例化和存在期 ** |\\r\\n| uninstall | 卸载组件。执行remove方法会触发该事件 | 销毁时 |\\r\\n| beforeUpdate | 更新前 | 存在期 |\\r\\n| afterUpdate | 更新后 | 存在期 |\\r\\n\\r\\n## 示意图\\r\\n\\r\\n![lc](http://images2015.cnblogs.com/blog/105416/201701/105416-20170119153018546-1566368987.png)\\r\\n \\r\\n需要注意的是installed在实例化期也会执行上图没有标出。比如组件被移除再进行还原会执行再比如新增新的组件也会执行。\\r\\n \\r\\n### 举个例子\\r\\n\\r\\n```js\\r\\nclass Timer extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n install () {\\r\\n this.data = {secondsElapsed: 0};\\r\\n }\\r\\n\\r\\n tick() {\\r\\n this.data.secondsElapsed++;\\r\\n this.update();\\r\\n }\\r\\n\\r\\n installed(){\\r\\n this.interval = setInterval(() => this.tick(), 1000);\\r\\n }\\r\\n\\r\\n uninstall() {\\r\\n clearInterval(this.interval);\\r\\n }\\r\\n\\r\\n\\r\\n style () {\\r\\n return `\\r\\n .num { color:red; }\\r\\n `;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>Seconds Elapsed:<span class=\\\"num\\\"> {{secondsElapsed}}</span></div>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=lifecycle)\""
module.exports = "module.exports = \"<h2 id=\\\"继承\\\">继承</h2>\\r\\n\\r\\n通过继承机制可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类又称为父类。由已存在的类派生出的新类称为派生类又称为子类。\\r\\n\\r\\n### 举个例子\\r\\n\\r\\n```js\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n div{\\r\\n cursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target, evt){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return ' <div onclick=\\\"handleClick(this,event)\\\">Hello {{name}}!</div>'\\r\\n }\\r\\n}\\r\\n\\r\\nclass SubHello extends Hello {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new SubHello({ name : 'Omi' }),'#container');\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=inherit)\\r\\n\\r\\n### ES5下的继承\\r\\n\\r\\n```js\\r\\nvar Hello = Omi.create(\\\"Hello\\\",{\\r\\n render:function(){\\r\\n return ' <div>Hello {{name}}!</div>'\\r\\n }\\r\\n})\\r\\n\\r\\nvar SubHello = Omi.create(\\\"SubHello\\\",Hello,{ });\\r\\n\\r\\n\\r\\nOmi.render(new SubHello({ name : 'Omi' }),'#container');\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=inherit_es5)\""
/***/ },
/* 21 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"循环遍历\\\">循环遍历</h2>\\r\\n\\r\\n下面介绍mustache.js的方式和javascript遍历的方式。\\r\\n\\r\\n### 方式一\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <ul> {{#items}} <li id=\\\"{{id}}\\\">{{text}}</li> {{/items}}</ul>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new List({\\r\\n items: [\\r\\n {id: 1, text: 'Omi'},\\r\\n {id: 2, text: 'dntzhang'},\\r\\n {id: 3, text: 'AlloyTeam'}\\r\\n ]\\r\\n}),\\\"body\\\");\\r\\n```\\r\\n\\r\\nmustache.js更详细的循环遍历使用可看[https://github.com/janl/mustache.js#non-empty-lists](https://github.com/janl/mustache.js#non-empty-lists)。 比如还支持:\\r\\n\\r\\n* 如果items的每一项是字符串可以直接**{{.}}**的方式来输出每一项\\r\\n* 循环的时候调用定义好的函数\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=list)\\r\\n\\r\\n### 方式二\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render() {\\r\\n return `<div>\\r\\n <ul>\\r\\n ` + this.data.items.map(item =>\\r\\n '<li id=\\\"' + item.id + '\\\">' + item.text + '</li>'\\r\\n ).join(\\\"\\\") + `\\r\\n </ul>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new List({\\r\\n items: [\\r\\n {id: 1, text: 'Omi'},\\r\\n {id: 2, text: 'dntzhang'},\\r\\n {id: 3, text: 'AlloyTeam'}\\r\\n ]\\r\\n}),\\\"body\\\");\\r\\n```\\r\\n\\r\\n你将在页面看到如下效果:\\r\\n\\r\\n![pv](http://images2015.cnblogs.com/blog/105416/201701/105416-20170122095724129-2059595233.png)\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=list2)\""
module.exports = "module.exports = \"<h2 id=\\\"安装\\\">安装</h2>\\n\\nOmi是一款用于创建用户界面的组件化框架开放并且现代故得名Omi。\\n\\n### 安装 Omi\\n\\n我们推荐使用 [npm](https://www.npmjs.com/) 来管理你的前端依赖.\\n\\n通过npm安装Omi你只需要执行下面的命令:\\n\\n``` js\\nnpm install omi\\n```\""
/***/ },
/* 22 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"模板切换\\\">模板切换</h2>\\r\\n\\r\\nOmi有三个版本。其中的omi.js和omi.lite.js属于Web端使用的版本。\\r\\n\\r\\n* omi.js内置了[mustache.js](https://github.com/janl/mustache.js)作为模版引擎\\r\\n* omi.lite.js不包含任何模版引擎\\r\\n\\r\\nOmi不强制开发者使用mustache.js你可以根据业务场景使用任意模板引擎或者不使用模板引擎。\\r\\n\\r\\n那么怎么使用别的模板引擎下面拿[artTemplate](https://github.com/aui/artTemplate)作为例子。\\r\\n\\r\\n### 使用artTemplate\\r\\n\\r\\n```js\\r\\nOmi.template = function(tpl, data){\\r\\n return artTemplate.compile(tpl)(data);\\r\\n}\\r\\n```\\r\\n重写Omi.template方法tpl为传入的模板data为模板所需的数据返回值为HTML。\\r\\n重写完毕后就能在render使用artTemplate的语法\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n style () {\\r\\n return `\\r\\n h1 { color:red; }\\r\\n li{ color:green;}\\r\\n `;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<h1>{{title}}</h1>\\r\\n <ul>\\r\\n {{each list as value i}}\\r\\n <li>索引 {{i + 1}} {{value}}</li>\\r\\n {{/each}}\\r\\n </ul>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n### 相关地址\\r\\n\\r\\n* [演示地址](http://alloyteam.github.io/omi/example/artTemplate/)\\r\\n* [源码地址](https://github.com/AlloyTeam/omi/tree/master/example/artTemplate)\""
module.exports = "module.exports = \"<h2 id=\\\"生命周期\\\">生命周期</h2>\\r\\n\\r\\n\\r\\n| 名称 | 含义 | 时机 |\\r\\n| :-------------: |:-------------:|: -----:|\\r\\n| constructor | 构造函数 | new的时候 |\\r\\n| install | 初始化安装这可以拿到用户传进的data进行处理 | 实例化 |\\r\\n| installed | 安装完成HTML已经插入页面之后执行。注意组件被remove之后再进行restore也会执行 | ** 实例化和存在期 ** |\\r\\n| uninstall | 卸载组件。执行remove方法会触发该事件 | 销毁时 |\\r\\n| beforeUpdate | 更新前 | 存在期 |\\r\\n| afterUpdate | 更新后 | 存在期 |\\r\\n\\r\\n## 示意图\\r\\n\\r\\n![lc](http://images2015.cnblogs.com/blog/105416/201701/105416-20170119153018546-1566368987.png)\\r\\n \\r\\n需要注意的是installed在实例化期也会执行上图没有标出。比如组件被移除再进行还原会执行再比如新增新的组件也会执行。\\r\\n \\r\\n### 举个例子\\r\\n\\r\\n```js\\r\\nclass Timer extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n install () {\\r\\n this.data = {secondsElapsed: 0};\\r\\n }\\r\\n\\r\\n tick() {\\r\\n this.data.secondsElapsed++;\\r\\n this.update();\\r\\n }\\r\\n\\r\\n installed(){\\r\\n this.interval = setInterval(() => this.tick(), 1000);\\r\\n }\\r\\n\\r\\n uninstall() {\\r\\n clearInterval(this.interval);\\r\\n }\\r\\n\\r\\n\\r\\n style () {\\r\\n return `\\r\\n .num { color:red; }\\r\\n `;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>Seconds Elapsed:<span class=\\\"num\\\"> {{secondsElapsed}}</span></div>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=lifecycle)\""
/***/ },
/* 23 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"Omi的理念\\\">Omi的理念</h2>\\r\\n\\r\\nOmi的理念是基于面向对象编程体系内建积木系统。\\r\\n 传统的单向数据流或者抛出event的组件通讯方式增加了系统的稳定性但是丧失了灵活性。一定程度上也降低了组建的复用。所谓鱼和熊掌不可兼得。\\r\\n 面向对象体系需要多一个逻辑层可以自由操作所有组件的instanceinstance之间的逻辑关系构建出了整个程序。这样组建间的逻辑通信复用就全部迎刃而解。组建也更加单一职责更松耦合。\\r\\n\\r\\n对比函数式编程、命令式编程与面向对象编程可以归纳总结出下面几条\\r\\n\\r\\n- 命令式编程干脆直接,利用循环条件等控制流程,强调执行过程\\r\\n- 命令式编程对硬件执行友好,运行更容易,却阻碍了复杂程序的设计\\r\\n- 函数式强调输入和输出,并非执行过程\\r\\n- 函数式倡导多个简单执行单元组合成复杂运算程序\\r\\n- 面向对象编程将对象作为程序的基本单元,更具有重用性、灵活性和扩展性\\r\\n\\r\\n Javascript是哪种类型的语言现在ES6+已经有了class。那么他是面向对象语言\\r\\n但是JS可以在任意地方定义函数并且当作把函数当作值来传递。那么他是函数式编程语言\\r\\n所以没有精准的定义取决于你的用法和姿势。其次Web组件化架构层面编程模型和语言层面编程模型是非常自由的关系。意思就是你可以用Javascript构建函数式编程框架如React也可以基于面向对象体系搭建Omi。\\r\\n\\r\\n### 函数式编程 VS 面向对象编程\\r\\n\\r\\n在UI组件框架层面函数式编程的代表有ReactOmi属于面向对象编程体系。那么他们各有什么优缺点下面做了个对比其实也是函数式编程与面向对象编程的对比\\r\\n\\r\\n| | React | Omi |\\r\\n| ------------- |:-------------:|:-----:|\\r\\n| 组件通信 | ★★★★☆| ★★★★★ |\\r\\n| 稳定性 | ★★★★★ | ★★★★☆ |\\r\\n| 灵活性 | ★★★★☆| ★★★★★ |\\r\\n| 扩展性 | ★★★★☆ | ★★★★★ |\\r\\n| 测试性 | ★★★★★ | ★★★★☆ |\\r\\n| 文件大小 | ★★★☆☆ | ★★★★★ |\\r\\n| 功能特性 | ★★★☆☆ | ★★★★☆ |\\r\\n| DOM性能 | ★★★★★ | ★★★★☆ |\\r\\n| 动画性能 | ★★★★☆ | ★★★★★ |\\r\\n| 抽象复杂度 | ★★★★☆ | ★★★★★ |\\r\\n| 异步编程 | ★★★★★ | ★★★★☆ |\\r\\n\\r\\n可以看得出鱼和熊掌不可兼得。面向对象编程更具有重用性、灵活性和扩展性带来的问题就是更加难测试。\\r\\n具体来说如函数式编程其测试面积是state1 + state2 + ... + stateN在面向对象编程中其测试面积是state1×event1 + state2×event2 + ... + stateN×eventN。\\r\\n\\r\\n总结来说更加推荐使用面向对象的方式去搭建UI组件化框架。\\r\\n\\r\\n<hr/>\\r\\n\\r\\n### 全文结束,感谢阅读。[开始Omi之旅吧!](https://github.com/AlloyTeam/omi)\\r\\n\\r\\n\""
module.exports = "module.exports = \"<h2 id=\\\"循环遍历\\\">循环遍历</h2>\\r\\n\\r\\n下面介绍mustache.js的方式和javascript遍历的方式。\\r\\n\\r\\n### 方式一\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<div>\\r\\n <ul> {{#items}} <li id=\\\"{{id}}\\\">{{text}}</li> {{/items}}</ul>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new List({\\r\\n items: [\\r\\n {id: 1, text: 'Omi'},\\r\\n {id: 2, text: 'dntzhang'},\\r\\n {id: 3, text: 'AlloyTeam'}\\r\\n ]\\r\\n}),\\\"body\\\");\\r\\n```\\r\\n\\r\\nmustache.js更详细的循环遍历使用可看[https://github.com/janl/mustache.js#non-empty-lists](https://github.com/janl/mustache.js#non-empty-lists)。 比如还支持:\\r\\n\\r\\n* 如果items的每一项是字符串可以直接**{{.}}**的方式来输出每一项\\r\\n* 循环的时候调用定义好的函数\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=list)\\r\\n\\r\\n### 方式二\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n render() {\\r\\n return `<div>\\r\\n <ul>\\r\\n ` + this.data.items.map(item =>\\r\\n '<li id=\\\"' + item.id + '\\\">' + item.text + '</li>'\\r\\n ).join(\\\"\\\") + `\\r\\n </ul>\\r\\n </div>`;\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new List({\\r\\n items: [\\r\\n {id: 1, text: 'Omi'},\\r\\n {id: 2, text: 'dntzhang'},\\r\\n {id: 3, text: 'AlloyTeam'}\\r\\n ]\\r\\n}),\\\"body\\\");\\r\\n```\\r\\n\\r\\n你将在页面看到如下效果:\\r\\n\\r\\n![pv](http://images2015.cnblogs.com/blog/105416/201701/105416-20170122095724129-2059595233.png)\\r\\n\\r\\n[[点击这里->在线试试]](http://alloyteam.github.io/omi/website/redirect.html?type=list2)\""
/***/ },
/* 24 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"Hello World\\\">Hello World</h2>\\r\\n\\r\\n\\r\\n### Hello World with ES20XX \\r\\n\\r\\nWe recommend using a bundler like [webpack](https://webpack.github.io/) or [Browserify](http://browserify.org/) so you can write modular code and bundle it together into small packages to optimize load time.\\r\\n\\r\\nThe small Omi example looks like this:\\r\\n\\r\\n```js\\r\\nimport Omi from './omi.js';\\r\\n\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n h1{\\r\\n cursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <h1 onclick=\\\"handleClick(this)\\\">Hello ,{{name}}!</h1>\\r\\n </div>\\r\\n `;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new Hello({ name : \\\"Omi\\\" }),\\\"body\\\");\\r\\n\\r\\n```\\r\\n\\r\\nThis code renders into body element. \\r\\n\\r\\n\\r\\n### Hello World with ES5\\r\\n\\r\\n\\r\\n```html\\r\\n<script src=\\\"omi.js\\\"></script>\\r\\n```\""
module.exports = "module.exports = \"<h2 id=\\\"环境搭建\\\">环境搭建</h2>\\r\\n\\r\\n我们使用 Webpack + ES6 的方式去开发Omi框架使用karma+jasmine来作为Omi的测试工具。\\r\\n\\r\\n## 开发依赖包\\r\\n\\r\\n在package.json中有如下配置:\\r\\n\\r\\n```js\\r\\n \\\"devDependencies\\\": {\\r\\n \\\"babel-core\\\": \\\"^6.0.20\\\",\\r\\n \\\"babel-loader\\\": \\\"^6.0.1\\\",\\r\\n \\\"babel-preset-es2015\\\": \\\"^6.0.15\\\",\\r\\n \\\"node-libs-browser\\\": \\\"^0.5.3\\\",\\r\\n \\\"webpack\\\": \\\"^1.14.0\\\",\\r\\n \\\"jasmine-core\\\": \\\"^2.5.2\\\",\\r\\n \\\"karma\\\": \\\"^1.3.0\\\",\\r\\n \\\"karma-chrome-launcher\\\": \\\"^2.0.0\\\",\\r\\n \\\"karma-jasmine\\\": \\\"^1.1.0\\\",\\r\\n \\\"karma-webpack\\\": \\\"^1.8.1\\\"\\r\\n }\\r\\n```\\r\\n\\r\\n* ES6+相关依赖有babel-core、babel-loader和babel-preset-es2015\\r\\n* webpack相关依赖有node-libs-browser和webpack\\r\\n* 其余都是单元测试相关依赖\\r\\n\\r\\n 注意这里使用了karma-webpack。因为使用Omi框架支持ES6+和ES5,使用karma-webpack是为了在单元测试里面使用ES6+的import和Class等语法。\\r\\n\\r\\n在karma.conf.js中配置webpack:\\r\\n\\r\\n```js\\r\\n webpack: webpackConfig,\\r\\n webpackMiddleware:{\\r\\n noInfo:false\\r\\n },\\r\\n plugins: [\\r\\n 'karma-webpack',\\r\\n 'karma-jasmine',\\r\\n 'karma-chrome-launcher'\\r\\n ]\\r\\n```\\r\\n\\r\\n具体配置看test目录下的karma.conf.js和webpack.test.config.js便可。\\r\\n\\r\\n注意karma.conf.js需要设置\\r\\n\\r\\n```js\\r\\n// if true, Karma captures browsers, runs the tests and exits\\r\\nsingleRun: true,\\r\\n```\\r\\n\\r\\n不然travis ci脚本执行的时候不会中断导致执行异常。\\r\\n\\r\\n### npm 脚本\\r\\n\\r\\n```js\\r\\n \\\"scripts\\\": {\\r\\n \\\"build\\\": \\\"webpack -w\\\",\\r\\n \\\"test\\\": \\\"karma start test/karma.conf.js\\\",\\r\\n \\\"hello\\\": \\\"webpack -w\\\",\\r\\n \\\"todo\\\": \\\"webpack -w\\\"\\r\\n }\\r\\n```\\r\\n\\r\\n其中\\r\\n* npm run build : 生成dist目录的omi.js文件\\r\\n* npm run test : 执行单元测试\\r\\n* npm run hello : 编译hello的demo\\r\\n* npm run todo : 编译todo的demo\\r\\n\\r\\n在webpack.config.js中会根据 process.env.npm_lifecycle_event去设置不同的入口文件。所以同样是执行webpack -w执行结果可以不一样。\\r\\n\\r\\n\""
/***/ },
/* 25 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"Installation\\\">Installation</h2>\\r\\n\\r\\nOmi is open and modern framework for building user interfaces.\\r\\n\\r\\n### Installing Omi\\r\\n\\r\\nWe recommend using [npm](https://www.npmjs.com/) for managing front-end dependencies. If you're new to package managers.\\r\\n\\r\\nTo install Omi with npm, run:\\r\\n\\r\\n``` js\\r\\nnpm install omi\\r\\n```\""
module.exports = "module.exports = \"<h2 id=\\\"模板切换\\\">模板切换</h2>\\r\\n\\r\\nOmi有三个版本。其中的omi.js和omi.lite.js属于Web端使用的版本。\\r\\n\\r\\n* omi.js内置了[mustache.js](https://github.com/janl/mustache.js)作为模版引擎\\r\\n* omi.lite.js不包含任何模版引擎\\r\\n\\r\\nOmi不强制开发者使用mustache.js你可以根据业务场景使用任意模板引擎或者不使用模板引擎。\\r\\n\\r\\n那么怎么使用别的模板引擎下面拿[artTemplate](https://github.com/aui/artTemplate)作为例子。\\r\\n\\r\\n### 使用artTemplate\\r\\n\\r\\n```js\\r\\nOmi.template = function(tpl, data){\\r\\n return artTemplate.compile(tpl)(data);\\r\\n}\\r\\n```\\r\\n重写Omi.template方法tpl为传入的模板data为模板所需的数据返回值为HTML。\\r\\n重写完毕后就能在render使用artTemplate的语法\\r\\n\\r\\n```js\\r\\nclass List extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n\\r\\n style () {\\r\\n return `\\r\\n h1 { color:red; }\\r\\n li{ color:green;}\\r\\n `;\\r\\n }\\r\\n\\r\\n render () {\\r\\n return `<h1>{{title}}</h1>\\r\\n <ul>\\r\\n {{each list as value i}}\\r\\n <li>索引 {{i + 1}} {{value}}</li>\\r\\n {{/each}}\\r\\n </ul>`;\\r\\n }\\r\\n}\\r\\n```\\r\\n\\r\\n### 相关地址\\r\\n\\r\\n* [演示地址](http://alloyteam.github.io/omi/example/artTemplate/)\\r\\n* [源码地址](https://github.com/AlloyTeam/omi/tree/master/example/artTemplate)\""
/***/ },
/* 26 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"Omi的理念\\\">Omi的理念</h2>\\r\\n\\r\\nOmi的理念是基于面向对象编程体系内建积木系统。\\r\\n 传统的单向数据流或者抛出event的组件通讯方式增加了系统的稳定性但是丧失了灵活性。一定程度上也降低了组建的复用。所谓鱼和熊掌不可兼得。\\r\\n 面向对象体系需要多一个逻辑层可以自由操作所有组件的instanceinstance之间的逻辑关系构建出了整个程序。这样组建间的逻辑通信复用就全部迎刃而解。组建也更加单一职责更松耦合。\\r\\n\\r\\n对比函数式编程、命令式编程与面向对象编程可以归纳总结出下面几条\\r\\n\\r\\n- 命令式编程干脆直接,利用循环条件等控制流程,强调执行过程\\r\\n- 命令式编程对硬件执行友好,运行更容易,却阻碍了复杂程序的设计\\r\\n- 函数式强调输入和输出,并非执行过程\\r\\n- 函数式倡导多个简单执行单元组合成复杂运算程序\\r\\n- 面向对象编程将对象作为程序的基本单元,更具有重用性、灵活性和扩展性\\r\\n\\r\\n Javascript是哪种类型的语言现在ES6+已经有了class。那么他是面向对象语言\\r\\n但是JS可以在任意地方定义函数并且当作把函数当作值来传递。那么他是函数式编程语言\\r\\n所以没有精准的定义取决于你的用法和姿势。其次Web组件化架构层面编程模型和语言层面编程模型是非常自由的关系。意思就是你可以用Javascript构建函数式编程框架如React也可以基于面向对象体系搭建Omi。\\r\\n\\r\\n### 函数式编程 VS 面向对象编程\\r\\n\\r\\n在UI组件框架层面函数式编程的代表有ReactOmi属于面向对象编程体系。那么他们各有什么优缺点下面做了个对比其实也是函数式编程与面向对象编程的对比\\r\\n\\r\\n| | React | Omi |\\r\\n| ------------- |:-------------:|:-----:|\\r\\n| 组件通信 | ★★★★☆| ★★★★★ |\\r\\n| 稳定性 | ★★★★★ | ★★★★☆ |\\r\\n| 灵活性 | ★★★★☆| ★★★★★ |\\r\\n| 扩展性 | ★★★★☆ | ★★★★★ |\\r\\n| 测试性 | ★★★★★ | ★★★★☆ |\\r\\n| 文件大小 | ★★★☆☆ | ★★★★★ |\\r\\n| 功能特性 | ★★★☆☆ | ★★★★☆ |\\r\\n| DOM性能 | ★★★★★ | ★★★★☆ |\\r\\n| 动画性能 | ★★★★☆ | ★★★★★ |\\r\\n| 抽象复杂度 | ★★★★☆ | ★★★★★ |\\r\\n| 异步编程 | ★★★★★ | ★★★★☆ |\\r\\n\\r\\n可以看得出鱼和熊掌不可兼得。面向对象编程更具有重用性、灵活性和扩展性带来的问题就是更加难测试。\\r\\n具体来说如函数式编程其测试面积是state1 + state2 + ... + stateN在面向对象编程中其测试面积是state1×event1 + state2×event2 + ... + stateN×eventN。\\r\\n\\r\\n总结来说更加推荐使用面向对象的方式去搭建UI组件化框架。\\r\\n\\r\\n<hr/>\\r\\n\\r\\n### 全文结束,感谢阅读。[开始Omi之旅吧!](https://github.com/AlloyTeam/omi)\\r\\n\\r\\n\""
/***/ },
/* 27 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"Hello World\\\">Hello World</h2>\\r\\n\\r\\n\\r\\n### Hello World with ES20XX \\r\\n\\r\\nWe recommend using a bundler like [webpack](https://webpack.github.io/) or [Browserify](http://browserify.org/) so you can write modular code and bundle it together into small packages to optimize load time.\\r\\n\\r\\nThe small Omi example looks like this:\\r\\n\\r\\n```js\\r\\nimport Omi from './omi.js';\\r\\n\\r\\nclass Hello extends Omi.Component {\\r\\n constructor(data) {\\r\\n super(data);\\r\\n }\\r\\n style () {\\r\\n return `\\r\\n h1{\\r\\n cursor:pointer;\\r\\n }\\r\\n `;\\r\\n }\\r\\n handleClick(target){\\r\\n alert(target.innerHTML);\\r\\n }\\r\\n render() {\\r\\n return `\\r\\n <div>\\r\\n <h1 onclick=\\\"handleClick(this)\\\">Hello ,{{name}}!</h1>\\r\\n </div>\\r\\n `;\\r\\n\\r\\n }\\r\\n}\\r\\n\\r\\nOmi.render(new Hello({ name : \\\"Omi\\\" }),\\\"body\\\");\\r\\n\\r\\n```\\r\\n\\r\\nThis code renders into body element. \\r\\n\\r\\n\\r\\n### Hello World with ES5\\r\\n\\r\\n\\r\\n```html\\r\\n<script src=\\\"omi.js\\\"></script>\\r\\n```\""
/***/ },
/* 28 */
/***/ function(module, exports) {
module.exports = "module.exports = \"<h2 id=\\\"Installation\\\">Installation</h2>\\r\\n\\r\\nOmi is open and modern framework for building user interfaces.\\r\\n\\r\\n### Installing Omi\\r\\n\\r\\nWe recommend using [npm](https://www.npmjs.com/) for managing front-end dependencies. If you're new to package managers.\\r\\n\\r\\nTo install Omi with npm, run:\\r\\n\\r\\n``` js\\r\\nnpm install omi\\r\\n```\""
/***/ },
/* 29 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
@ -1960,10 +2005,14 @@
var _index2 = _interopRequireDefault(_index);
var _list = __webpack_require__(27);
var _list = __webpack_require__(30);
var _list2 = _interopRequireDefault(_list);
var _config = __webpack_require__(10);
var _config2 = _interopRequireDefault(_config);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@ -1986,16 +2035,7 @@
_createClass(Sidebar, [{
key: 'install',
value: function install() {
if (this.data.lan === "cn") {
this.data.items = [{ title: "快速开始", list: [{ "name": "安装" }, { "name": "Hello World" }, { "name": "组件" }, { "name": "组件通讯" }, { "name": "生命周期" }, { "name": "事件处理" }, { "name": "条件判断" }, { "name": "循环遍历" }, { "name": "表单" }, { "name": "继承" },
//{"name": "容器系统"},
{ "name": "模板切换" },
//{"name": "服务器端渲染"},
{ "name": "Omi的理念" }] }, { title: "Omi原理", list: [{ "name": "未完待续" }, { "name": "..." }, { "name": "..." }, { "name": "..." }] }];
} else {
this.data.items = [{ title: "QUICK START", list: [{ "name": "Installation" }, { "name": "Hello World" }, { "name": "Components" }, { "name": "Lifecycle" }, { "name": "Handling Events" }, { "name": "Conditional Rendering" }, { "name": "Lists and Keys" }, { "name": "Forms" }, { "name": "Inheritance" }, { "name": "Sever-side Rendering" }, { "name": "Thinking In Omi" }] }, { title: "Omi's Principle", list: [{ "name": "Scroped CSS" }] }];
}
this.data.items = _config2.default[this.data.lan + '_menus'];
this.data.height = window.innerHeight - 45;
this.childrenData = this.data.items;
}
@ -2017,7 +2057,7 @@
exports.default = Sidebar;
/***/ },
/* 27 */
/* 30 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
@ -2067,7 +2107,7 @@
exports.default = List;
/***/ },
/* 28 */
/* 31 */
/***/ function(module, exports, __webpack_require__) {
'use strict';

50
website/js/config.js Normal file
View File

@ -0,0 +1,50 @@
const config = {
//1,5-6,8
highlight:{3: '6', 6: '5', 9: '3,9,34', 19: '22', 22: '6-12',33:'13,18'},
mds:['installation', 'hello_world', 'components', 'communication', 'lifecycle', 'events', 'condition', 'loop', 'form', 'inherit', 'template', 'get_dom', 'thinking_in_omi'],
cn_menus:[
{title: "快速开始", list: [
{"name": "安装"},
{"name": "Hello World"},
{"name": "组件"},
{"name": "组件通讯"},
{"name": "生命周期"},
{"name": "事件处理"},
{"name": "条件判断"},
{"name": "循环遍历"},
{"name": "表单"},
{"name": "继承"},
//{"name": "容器系统"},
{"name": "模板切换"},
{"name": "获取DOM节点"},
//{"name": "服务器端渲染"},
{"name": "Omi的理念"}
]},
{title: "Omi原理", list: [
{"name": "未完待续"},
{"name": "..."},
{"name": "..."},
{"name": "..."}
]}
],
en_menu:[
{title: "QUICK START", list: [
{"name": "Installation"},
{"name": "Hello World"},
{"name": "Components"},
{"name": "Lifecycle"},
{"name": "Handling Events"},
{"name": "Conditional Rendering"},
{"name": "Lists and Keys"},
{"name": "Forms"},
{"name": "Inheritance"},
{"name": "Sever-side Rendering"},
{"name": "Thinking In Omi"}
]},
{title: "Principle of Omi", list: [ {"name": "Scoped CSS"}]}
]
}
export default config;

View File

@ -33,6 +33,8 @@
goto('http://alloyteam.github.io/omi/example/playground/index.html?code=var%20Hello%20%3D%20%20Omi.create(%22Hello%22%2C%7B%0A%20%20render%3Afunction()%7B%0A%20%20%20%20return%20%20%27%20%3Cdiv%3EHello%20%7B%7Bname%7D%7D!%3C%2Fdiv%3E%27%0A%20%20%7D%0A%7D)%0A%0Avar%20SubHello%20%3D%20%20Omi.create(%22SubHello%22%2CHello%2C%7B%20%7D)%3B%0A%0A%0AOmi.render(new%20SubHello(%7B%20name%20%3A%20%27Omi%27%20%7D)%2C%27%23container%27)%3B');
}else if(type === 'inherit'){
goto('http://alloyteam.github.io/omi/example/playground/index.html?code=class%20Hello%20extends%20Omi.Component%20%7B%0A%20%20%20%20constructor(data)%20%7B%0A%20%20%20%20%20%20%20%20super(data)%3B%0A%20%20%20%20%7D%0A%20%20%20%20style%20()%20%7B%0A%20%20%20%20%20%20%20%20return%20%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20div%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cursor%3Apointer%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%60%3B%0A%20%20%20%20%7D%0A%20%20%20%20handleClick(target%2C%20evt)%7B%0A%20%20%20%20%20%20%20%20alert(target.innerHTML)%3B%0A%20%20%20%20%7D%0A%20%20%20%20render()%20%7B%0A%20%20%20%20%20%20%20return%20%20%27%20%3Cdiv%20onclick%3D%22handleClick(this%2Cevent)%22%3EHello%20%7B%7Bname%7D%7D!%3C%2Fdiv%3E%27%0A%0A%20%20%20%20%7D%0A%7D%0A%0Aclass%20SubHello%20extends%20Hello%20%7B%0A%20%20%20%20constructor(data)%20%7B%0A%20%20%20%20%20%20%20%20super(data)%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%0A%0A%0AOmi.render(new%20SubHello(%7B%20name%20%3A%20%27Omi%27%20%7D)%2C%27%23container%27)%3B');
}else if(type === 'ref'){
goto('http://alloyteam.github.io/omi/example/playground/index.html?code=class%20Hello%20extends%20Omi.Component%20%7B%0A%20%20%20%20constructor(data)%20%7B%0A%20%20%20%20%20%20%20%20super(data)%3B%0A%20%20%20%20%7D%0A%20%20%20%20style%20()%20%7B%0A%20%20%20%20%20%20%20%20return%20%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20h1%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cursor%3Apointer%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%60%3B%0A%20%20%20%20%7D%0A%20%20%20%20handleClick()%7B%0A%20%20%20%20%20%20%20%20alert(this.refs.abc.innerHTML)%3B%0A%20%20%20%20%7D%0A%20%20%20%20render()%20%7B%0A%20%20%20%20%20%20%20%20return%20%20%60%0A%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ch1%20ref%3D%22abc%22%20onclick%3D%22handleClick()%22%3EHello%20%2C%7B%7Bname%7D%7D!%3C%2Fh1%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%60%3B%0A%0A%20%20%20%20%7D%0A%7D%0A%0AOmi.render(new%20Hello(%7B%20name%20%3A%20%22Omi%22%20%7D)%2C%22%23container%22)%3B');
}else{
goto('http://alloyteam.github.io/omi/example/playground/index.html');
}