(function(){
var User = function(name){
this.name = name;
};
// コールバックの保存先
User.records = [];
// イベントとコールバックの登録
User.bind = function(ev, callback){
var calls = this._callbacks || (this._callbacks = {});
(this._callbacks[ev] || (this._callbacks[ev] = [])).push(callback);
};
// イベントを発行
User.trigger = function(ev){
var list, calls, i, l;
if(!(calls = this._callbacks)) return this;
if(!(list = this._callbacks[ev])) return this;
jQuery.each(list, function(){ this() });
};
// 新規にインスタンスを作成
User.create = function(name){
// インスタンスを配列に保存
this.records.push(new this(name));
// changeイベントを発行
this.trigger('change');
};
jQuery(function($){
User.bind('change', function(){
// テンプレートを作成
var template = $('#userTmpl').tmpl(User.records);
// ビューの初期化
$('#users').empty();
// レンダリング
$('#users').append(template);
});
});
User.create('First one');
setTimeout(function(){
User.create('Another one');
});
}());
<script type="text/x-jquery-tmpl" id="userTmpl">
<li>${name}</li>
</script>
<ul id="users"></ul>
External resources loaded into this fiddle: