alibaba-inc/tpap — pull request #1 by alibaba-inc (2013-11-28 08:40:39+00:00)
Title: @fileOverview 步骤条组件的安全适配器

/**
* @fileOverview 步骤条组件的安全适配器
*/
KISSY.add(function (S, Stepbar) {
var DOM = S.DOM,
Event = S.Event;

/**
* 提供一个init方法，名字任取，最后模块return即可。 用来初始化适配器的
* 初始化方法需要返回一个函数，用来为每个沙箱环境提供适配对象。
* ps: 页面中可能会有多个安全沙箱环境。init方法内执行的可以理解为所有沙箱共享的一些内容对象，主要提供最原始的安全适配对象和方法。(执行一次,所有沙箱共享)
* init返回的函数可以理解是为每个沙箱提供的安全适配对象。(执行多次，每个沙箱对对象的操作不影响其他沙箱)
* 总结：可以理解为KISSY在frameGroup初始化的时候是一个对象，然后会copy多份，分别放到不同的沙箱环境中去执行。每个copy相互之间不影响
* @param frameGroup 页面中的沙箱环境，frame即为沙箱，frameGroup为沙箱组。沙箱的公共环境
* @returns {Function} 工厂获取实际的适配对象
*/
function init(frameGroup) {
/**
* 因为KISSY的组件构造函数只有一个，后面可能会对构造函数本身做修改
* 所以这里可以写一个SafeConstruector，相当于继承KISSY的组件，并且显示的声明要开放哪些api
*/
function SafeStepbar(el, config) {
this.inner = new Stepbar(el, config);
}

//为我们‘继承'的构造函数添加需要开放给外部使用的原型方法
SafeStepbar.prototype.on = function () {
var params = S.makeArray(arguments);
var self = this;
this.inner.on(params[0], function(e){
//这里因为用户肯定不需要用到e.halt这些函数，所以简单的将event封装一下（frameGroup.tame）即可
var event = {
attrName: e.attrName && e.attrName.toString(),
newVal: e.newVal && e.newVal.toString(),
prevVal: e.prevVal && e.prevVal.toString(),
newVal: e.newVal && e.newVal.toString()
};
params[1].call(self, frameGroup.tame(event));
});
};

SafeStepbar.prototype.render = function () {
this.inner.render();
};

SafeStepbar.prototype.allowColor = function () {
return this.inner.allowColor();
};

SafeStepbar.prototype.set = function (cls,num) {

this.inner.set(cls,num);
};

SafeStepbar.prototype.reset = function () {
this.inner.reset();
};

//---- 组件是一个构造函数进行初始化的，需要markCtor标记一下，让caja容器认识
frameGroup.markCtor(SafeStepbar);

//构造函数实例的方法，需要grantMethod ，加入白名单，没有加入白名单的不可以使用，caja容器不认识
frameGroup.grantMethod(SafeStepbar, "render");
frameGroup.grantMethod(SafeStepbar, "set");
frameGroup.grantMethod(SafeStepbar, "allowColor");
frameGroup.grantMethod(SafeStepbar, "on");
frameGroup.grantMethod(SafeStepbar, "reset");

/**
* @param context 上下文
* @param context.mod 沙箱的模块范围，所有操作必须限定到模块范围之内去执行
* @param context.frame 单个模块的沙箱
* @return {Object} 实际的组件对象
*/
return function (context) {

//最终需要返回给
return {
Stepbar: frameGroup.markFunction(function () {
arg=cajaAFTB.untame(arguments[0]);
arg.tameNode = S.all(arg, context.mod);
return new SafeStepbar(arg, cajaAFTB.untame(arguments[1]));
}),
kissy:true
}
}

}

return init;

}, {
requires: ['gallery/stepbar/1.1/index', 'gallery/stepbar/1.1/stepbar.css']
});