ES6ã¯ã©ã¹ä»æ§ã®æçµçãªå€æŽïŒè©³çŽ°ã¯ãã¡ãïŒã«ãããæ§æã«é¢ããŠå€§å¹ ãªåŠ¥åãããã«ãBackboneã§ES6ã¯ã©ã¹ã䜿çšããããšã¯ã§ããªããªããŸããã ããã«ç¶æ³ã®å®å šãªèª¬æãæžããŸã
ãããã£ãŠããã®ïŒ
class DocumentRow extends Backbone.View {
constructor() {
this.tagName = "li";
this.className = "document-row";
this.events = {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
};
super();
}
initialize() {
this.listenTo(this.model, "change", this.render);
}
render() {
//...
}
}
æçµçãªES6ä»æ§ã§ã¯ç¡å¹ã«ãªããŸããã 代ããã«ããããæ©èœããããå Žåã¯ã3ã€ã®ïŒããŸãé åçã§ã¯ãªãïŒãªãã·ã§ã³ãå¹æçã«ãããŸãã
ããã¯ããŒã³ã¯ãããå¯èœã«ããŸããã次ã®ãããªãã®ãæžãã®ã¯éŠ¬é¹¿ããŠãããšæããŸãã
class DocumentRow extends Backbone.View {
tagName() { return "li"; }
className() { return "document-row";}
events() {
return {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
};
}
initialize() {
this.listenTo(this.model, "change", this.render);
}
render() {
//...
}
}
çŸåšã®extendsæ§æãšæ¯èŒããŠ
ç°ãªãcidã§2åç®ã®åæåãå®è¡ãããšçºçããåé¡ãããããããããå®éã®ãªãã·ã§ã³ãšã¯èŠãªããŸããã
ããã¯ç§ã®ããã°ã®ã³ã¡ã³ãæçš¿è ã«ãã£ãŠææ¡ããããã®ã§ãããããããæãå®çšçãªçŸåšã®ãªãã·ã§ã³ã§ãã ããã¯æ¬¡ã®ããã«ãªããŸãã
class MyView extends Backbone.View {
constructor(options) {
_.defaults(options, {
// These options are assigned to the instance by Backbone
tagName: 'li',
className: 'document-row',
events: {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
},
// This option I'll have to assign to the instance myself
foo: 'bar'
});
super(options);
this.foo = options.foo;
}
}
ãããã®çŸåšã®ãªãã·ã§ã³ã¯ãã¹ãŠãçŸåšã®Backbone extendsæ§æãšæ¯èŒããŠæ確ãªåŠ¥åç¹ãå«ãã§ãããããããè¯ããœãªã¥ãŒã·ã§ã³ãéçºã§ããã°çŽ æŽããããšæããŸãã ãããã©ã®ããã«ãªããã¯å®å šã«ã¯ããããŸããããããã°ã®äœæäžã«é ã«æµ®ããã ã¢ã€ãã¢ã®1ã€ã¯ãããããã£ã®ããã·ã¥ãåºåãããããããã£ãé¢æ°ãè¿œå ããããšã§ããã 次ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãã®é¢æ°ãå®è¡ããã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã£ãŠå®è¡ãããä»ã®åŠçã®åã«ããããã€ã³ã¹ã¿ã³ã¹ã«è¿œå ã§ããŸãã
ãããããã¯ééããªãæ®å¿µã§ãã ã¬ãã°ã¯ãŒã¯ãããŠãããŠããããšãã
話ã®æèšã¯ãå°ãªããšãéçããããã£ã®ãµããŒããéå§ããããŸã§ãBackboneã§ES6ã¯ã©ã¹ã䜿çšããªãããšã ãšæããŸãã ããªããææ¡ãããã©ãŒã«ããã¯ãªãã·ã§ã³ã®ãã¡ãç§ã®å¥œãŸãã解決çã¯ãæåå/ãªããžã§ã¯ããæ»ãå€ãšããŠå®çŸ©ããããšã§ãã Backboneã®APIèšèšã®éèŠãªéšåã¯ããããã®ãããã¿ã€ãå ±ææååãšãªããžã§ã¯ãã«ãããéçºè ãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ã«åããããã£ãå²ãåœãŠãããã«èŠæ±ããããšã¯APIãæ±ããŸãïŒã¡ã¢ãªã浪費ããããšã¯èšããŸã§ããããŸããïŒã
äžè²«æ§ã¯å¥ãšããŠã extend
è¶
ããBackboneã§classããŒã¯ãŒãã䜿çšããçç±ã¯ãããŸããïŒ
çŽ æŽãããããã°æçš¿ã ES6ã¯ã©ã¹ãšããã¯ããŒã³ã¯ã©ã¹ãã©ã®ããã«é£æºããã®ãçåã«æããŸããã ããªãã®è§£æ±ºçã«ã€ããŠïŒ
話ã®æèšã¯ãå°ãªããšãéçããããã£ã®ãµããŒããéå§ããããŸã§ãBackboneã§ES6ã¯ã©ã¹ã䜿çšããªãããšã ãšæããŸãã
ã¯ã©ã¹ããããã£ã§ããã super()
åŒã³åºãã®åŸã«
äžè²«æ§ä»¥å€ã«ãBackbone overextendã§classããŒã¯ãŒãã䜿çšããçç±ã¯ãããŸããïŒ
ç§ã¯ããã°æçš¿ã§ããã«å¯ŸåŠããŸããã ç¹ã«ïŒ ããããçè«çã«ã¯ãBackboneã¯ã³ãŒããšè¿œå ã®æŠå¿µãé·æçã«åæžã§ããŸãããçŸå®çã«ã¯ãES6ã¯ã©ã¹ããã©ã³ã¹ãã€ã«ãªãã§ãã¹ãŠã®é¢é£ãã©ãŠã¶ãŒã§åºããµããŒãããããŸã§ã«ã¯ãå°ãªããšãæ°å¹Žã¯ããããŸããã³ãŒãã®åæžã¯æ¬¡ã®ããã«ãªããŸããäœã«ãã
ãã ããäžè²«æ§ã®åŽé¢ãéå°è©äŸ¡ããªãã§ãã ããã ãããJavaScriptã§ãªããžã§ã¯ãæåããã°ã©ãã³ã°ãè¡ããæ¹æ³ãã«ãªãå ŽåïŒEmber / Angular / React / Typescript / Aureliaãªã©ãããããæšæºåãããŠããããã§ãïŒãããã䜿çšããªãããã¯ããŒã³ã¯ãã©ã€ãã©ãªã«é¢é£ããè¿œå ã®åŠç¿æ²ç·ã«ãªããŸããå¥ã®ãªãã·ã§ã³ã ç¹ã«ãžã¥ãã¢éçºè åãã å¿ ãããå€æŽã«å€ãããã©ããã¯ããããŸããã ããããããã¯è¡åŠçãªãå°ããªå¿ã®ãããŽããªã³ãã®äžè²«æ§ã®ããã ãã§ã¯ãããŸããã
@ akre54ãš@jridgewellã«åæããŸããããã¹ãŠã®ããããã£ãé¢æ°ãšããŠã¢ã¿ãããããã¢ãããŒãããææ¡ããããªãã·ã§ã³ã®äžã§ããããæè¯ã§ãããšããããšã§ãã FWIWãç§ãæåã«çžå¯Ÿçãªjsã®æ°åè ãšããŠããã¯ããŒã³ãåŠãã§ãããšããç§ã¯ãããã®ãéçãããããã£ãšãããã®äœ¿çšæ¹æ³ã«å°ãæ··ä¹±ããŠããããšãèŠããŠããŸãã
ES7ã«ã¯æ£ããã¯ã©ã¹ããããã£ããããŸããhttpsïŒ //gist.github.com/jeffmo/054df782c05639da2adbã ãšæã
ES7ã®ææ¡ã¯ãŸãã«ããã§ãããéåžžã«åæã®ã³ãã¥ããã£äž»å°ã®ææ¡ã§ãã ãŸã£ããæ確ã§ã¯ãããŸããããå®éã«ã¯å ¬åŒä»æ§ã®äžéšã«ãªãã§ãããã çŸåšã®å®è£ ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®å®è¡åŸã«ããããã£ãã€ã³ã¹ã¿ã³ã¹ã«è¿œå ããããããããã¯ããŒã³ã«ã¯åœ¹ç«ã¡ãŸããã ïŒäžèšã®jridgewellã®ãªã³ã¯ãåç §ããããBabel 5.0.0ã§è©ŠããŠã¿ãŠãã ããïŒ
@jridgewellç§ã¯@benmccormickã®æçš¿ã®ãã®éšåãåç §ããŠããŸããïŒ
Reactéçºè ã¯ãBackboneãŠãŒã¶ãŒãééããã®ãšåãããããã£åæååã®åé¡ã«æ°ã¥ããŸããã Reactã®ããŒãžã§ã³0.13ã®äžéšãšããŠãã¯ã©ã¹ã®ç¹å¥ãªããããã£åæåæ§æããµããŒãããŠããŸããããã¯æçµçã«æšæºåãããå¯èœæ§ããããŸãã ãã®ESDiscussã¹ã¬ããã«ã¯ãããã«é¢ãã詳现æ å ±ããã
ããšãã°ã wycatsã®js-decoratorsã¹ãããŒãã³ãŸãã¯å ã®ïŒçœ®ãæããããïŒããŒã¢ããŒã¯ã©ã¹ã®ææ¡ãåç §ããŠãã ããã
ã¯ã©ã¹ããããã£ãæã€ã²ãã¿ãŒã䜿çšããããšããå§ãããŸãã
class Row extends Backbone.View {
get tagName() { return 'li'; }
}
絶察çãªæåŸã®æ段ãšããŠãããšãã°ãã«ããŒã䜿ã£ãŠéçãªå°éå
·ããã§ãã¯ããããšãã§ããŸã_.result
ïŒ
_.instOrStaticVar = function(instance, property) {
if (instance == null) return void 0;
var value = instance[property] || instance.constructor[property];
return _.isFunction(value) ? value.call(instance) : value;
}
ãããã§ãïŒ
æ®å¿µãªããããã®ããŒãžã§ã³ã§ã¯ãã¹ãŒããŒã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã®å®è¡åŸã«ã€ã³ã¹ã¿ã³ã¹åããããã®ãšããŠã¯ã©ã¹ããããã£ãå®çŸ©ãããŠãããããããã§ã®Backboneã®åé¡ã¯è§£æ±ºãããŸããã
ãããã£ãŠãES5ã¯æ¬¡ã®ããã«ãªããŸãã
// ES6
class View extends Backbone.View {
tagName = 'li';
constructor() {
// Do anything that doesn't touch `this`
super();
// Do anything that touches `this`
}
}
// ES5
function View() {
// Do anything that doesn't touch `this`
Backbone.View.apply(this, arguments);
// Add class properties
this.tagName = 'li';
// Do anything that touches `this`
}
View.prototype = _.create(Backbone.View.prototype, {
constructor: View
});
ã€ã³ã¹ã¿ã³ã¹å€æ°ãèšå®ããããã®å€æŽãååŸããåã«ãèŠçŽ ã¯åŒãç¶ãæ§ç¯ãããŸãã
ããšãã°ãwycatsã®js-decoratorsã¹ãããŒãã³ãåç §ããŠãã ãã...
ãã³ã¬ãŒã¿ãã©ã®ããã«é©çšãããã説æã§ããŸããïŒ
ã¯ã©ã¹ããããã£ãæã€ã²ãã¿ãŒã䜿çšããããšããå§ãããŸãã
ïŒ+1:ã ãã¹ãŠã®ããããã£ãé¢æ°ãšããŠãŸãã ç§ãã¡ãçŸåšæã£ãŠãããã®ã»ã©ãããã§ã¯ãããŸããããå®å šã«åãå ¥ããããçªç¶å€ç°ã®èšŒæ ã§ãã
絶察çãªæåŸã®æ段ãšããŠãããšãã°ãã«ããŒã䜿ã£ãŠéçãªå°éå ·ããã§ãã¯ããããšãã§ããŸãã
ããã¯é¢çœããããããŸãã...
ããªããã§ããããšïŒ
class MyView extends Backbone.View {
constructor() {
super({ tagName: 'h1' });
this.el.textContent = 'Hello World';
}
}
@thejameskyleããã¯ããã¹ãŠã®ããããã£ãããã©ã«ããªãã·ã§ã³ãšããŠã¹ãŒããŒã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãªãã·ã§ã³ã«
super()
ã«äŸåããŠã¯ã©ã¹ãèšå®ãã代ããã«ã init()
é¢æ°ãªã©ã䜿çšããããšãã§ããŸãã
class DocumentRow extends Backbone.View {
constructor() {
super();
this.tagName = "li";
this.className = "document-row";
this.events = {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
};
this.init();
}
initialize() {
this.listenTo(this.model, "change", this.render);
}
render() {
//...
}
}
@milesjããŒãïŒ ããã¯æçµçãªES6ã¯ã©ã¹ã®ä»æ§ã§ããã«ãšã©ãŒã«ãªããŸã
掟çã¯ã©ã¹ã§ã¯ãããã䜿çšããåã«superïŒïŒãåŒã³åºãå¿ èŠããããŸã
ãããæ©èœãããšããŠããå®éã«Backboneã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããšã¯ãªãããã®åæåã³ãŒããååŸããããšã¯ãããŸããã
ç§ã®æåã®æçš¿ããã®ãã®ãªã³ã¯ãåç §ããŠãã ããïŒ http ïŒ
@milesj ïŒåé¡ã¯ã this.tagName
ãªã©ãèšå®ããåã«super()
ãåŒã³åºãå¿
èŠããããšããããšã§ãã ãŸãããã¥ãŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§èŠçŽ ãthis.tagName
èšå®ããåã«ããã§ã«èŠçŽ ãäœæããŠããŸãã
@milesjã¯ããµãã¯ã©ã¹åãããšãã¯ãŸã èš±å¯ãããŠããŸããã
@jridgewellããããã¿ãŸãããç§ã¯ãããéããŸããã ããã¯æãèªç¶ãªéžæè¢ã®ããã§ãã ç§ã¯ããã«ã€ããŠjeffmoãšsebmckã«è©±ããŸããã
çããã«è£è©±ãäžããããã«ãçç±ã¯ããã€ãã£ãåïŒã€ãŸãé
åïŒã®æ¡åŒµããµããŒãããããã«ã super()
ã¡ãœãããåŒã³åºããŸã§this
ã決å®ãããªãããã§ãã ããããªããšãDOMïŒããã³ããããä»ã®å ŽæïŒã§åæåã®åé¡ãçºçããŸãã
@jridgewell @thejameskyle次ã«ãæåã«superïŒïŒãåŒã³åºãã ãã§ãïŒæŽæ°ãããäŸïŒã ES6ã¯ã©ã¹ã§ãåãããšãããã®ã§ãããã§ã¯åé¡ã¯çºçããŸããã ãã¥ãŒã³ã³ã¹ãã©ã¯ã¿ããžãã¯ãinit()
ã¡ãœããã«ç§»åããã ãã§ãã
@milesjå ã®ããã°æçš¿ãèªã¿ãŸãããïŒ ã¹ãŒããŒãã¡ãŒã¹ãã§å®è¡ãããšãããããã£ãåŠçãããŸããã 詳现ãªèª¬æã«ã€ããŠã¯ããã¡ããã芧ãã ããïŒ http ïŒ
ã¯ããç§ã¯ãããèªã¿ãŸããããããŠç§ã¯ãŸã ããã解決çã§ã¯ãªãçç±ã«èå³ããããŸãã 誰ãããã¥ãŒã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãå¿ èŠãããããšã«ã€ããŠè©±ãç¶ããŠããŸãããå¿ ããããããšã¯éããŸããã 次ã®ãããªãã®ã解決çã§ã¯ãªãã®ã¯ãªãã§ããïŒå°ã工倫ãããŠããŸããïŒïŒ
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
// extend()ing options is no longer needed if properties are set directly
};
View.prototype.setup = function() {
this._ensureElement();
this.initialize.call(this, arguments);
};
class DocumentRow extends Backbone.View {
constructor() {
super();
this.tagName = "li";
this.className = "document-row";
this.events = {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
};
this.setup(...arguments);
}
}
éES6ãšã®äžäœäºææ§ã®ããã«æšæž¬ããŠããŸããïŒ
ãã®å Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã#setup
åŒã³åºãããšã¯ãªããããããã©ã«ãã®View
ã¯ã©ã¹ã¯æ©èœããŸããã ãŸãããµãã¯ã©ã¹ã®åŒã³åºããsuper()
以å€ã«åŒ·å¶ãããšãéåžžã«ç
©ããããªããŸãã
ããã¯ãããã¯ããŒã³ã ãã§ãªãããã¹ãŠã®ES6ã¯ã©ã¹ã察åŠããªããã°ãªããªãåé¡ã§ãã BabelES7ã¯ã©ã¹ã®ããããã£ä»æ§ã䜿çšããŠå人çã«è§£æ±ºããŸããã
@milesjåè¿°ã®ããã«ãES7ã¯ã©ã¹ã®ããããã£ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®æåŸãŸã§ã€ã³ã¹ã¿ã³ã¹åãããªãããããã®åé¡ã解決ããŸããã
ç§ã¯ãããè¡ãããšã«ã€ããŠjeffmoãšsebmckã«è©±ããŸããïŒ
class Root {
rootProp = 'root';
constructor() {
console.log('Root', this.rootProp);
console.log('Root', this.derivedProp);
}
}
class Derived extends Root {
derivedProp = 'derived';
constructor() {
super();
console.log('Derived', this.rootProp);
console.log('Derived', this.derivedProp);
}
}
è±ç³ïŒ
function Root() {
this.rootProp = 'root';
console.log('Root', this.rootProp);
console.log('Root', this.derivedProp);
}
function Derived() {
super();
this.derivedProp = 'derived';
console.log('Derived', this.rootProp);
console.log('Derived', this.derivedProp);
}
ããããããã§ãããã§ã®åé¡ã¯ä¿®æ£ããããäžæŽåãçºçããŸãã
new Derived();
// >> 'Root' 'root'
// >> 'Root' undefined
// >> 'Derived' 'root'
// >> 'Derived' 'derived'
ããã¯ãããã¯ããŒã³ã ãã§ãªãããã¹ãŠã®ES6ã¯ã©ã¹ã察åŠããªããã°ãªããªãåé¡ã§ãã
ããŒãïŒ
BabelES7ã¯ã©ã¹ã®ããããã£ä»æ§ã䜿çšããŠå人çã«è§£æ±ºããŸããã
className
ã®ãªãå€ãã®DIVèŠçŽ ããããŸãã æåŸã®ãã€ã³ããåç
§ããŠãã ããhttps://github.com/jashkenas/backbone/issues/3560#issuecomment -90739676ã https://github.com/jashkenas/backbone/issues/3560#issuecomment -91601515ããã³HTTPSãïŒ// githubã®.com / jashkenas / backbone / issues / 3560ïŒissuecomment -98827719ã
åãããŸããã ãã®å Žåã¯ãããã¹ãŠã®ããããã£ãããã©ã«ããªãã·ã§ã³ãšããŠã¹ãŒããŒã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããªãã·ã§ã³ããŸãã¯ãããããã£ãã¡ãœããïŒã³ã³ã¹ãã©ã¯ã¿ãŒã«åœ±é¿ãäžããªãïŒã®äœæã«é¢ããæåŸã®è¡ã䜿çšããããšããå§ãããŸãã
class DocumentRow extends Backbone.View {
loadProperties() {
return {
tagName: 'li',
className: 'document-row',
events: {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
},
foo: 'bar'
};
}
}
// Contrived example
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
options || (options = {});
_.extend(this, this.loadProperties(), _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
};
Toolkitã§åæ§ã®ããšãè¡ããŸãããããã¯ã https ïŒ ã
ããã
ããã§ã®è°è«ãæ£ããç解ããŠããã°ãããã¯ããŒã³éçºè ã¯åé¿çãšãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠè°è«ããŠããŸããããã®åé¡ã«å¯ŸåŠããããã«BBã³ã¢ã«å®éã«å€æŽãå ããã€ããã¯ãããŸãããïŒ ïŒç§ã¯åœŒãããããã¹ãã ãšç€ºåããŠããããã§ã¯ãªãããããã®å€æŽãäœã§ãããã«ã€ããŠãç§ã«ã¯ããããŸããïŒã èšãæããã°ããã¹ãŠã®ããããã£ãé¢æ°ãšããŠäœ¿çšããããã²ãã¿ãŒããããã¯ã®æåŸã®åèªãšããŠäœ¿çšãããšããææ¡ã§ããïŒ ããããšãã
@gotofritzãã¹ãŠã®ããããã£ãã€ã³ã¹ã¿ã³ã¹äžã«åŒ·å¶çã«ååšãããES6ã®ãœãªã¥ãŒã·ã§ã³ã¯æ¡åŒµã§ããªããããåé¿çã«ã€ããŠèª¬æããŠããŸãã ããã¯ããŒã³ã®ã¯ã©ã¹ã·ã¹ãã ã¯ããã§æ£ããããšãããŠããŸãã
ES7ã¯ã©ã¹ã«éçãããã¿ã€ãããããã£ãããã€ãã®è°è«ããããŸããããããŸã§ã®ãšããå
·äœçãªããšã¯äœããããŸããã ãããŸã§ã®éãBackboneã®extend
åºå·ãããšæããŸãã
ããããšãã ES6ã¯ã©ã¹ãããå°ãè©ŠããŠã¿ãŸã... :-)
ããã«ééããä»ã®äººã®å©çã®ããã«ãå®éã«ã¯ããã¹ãŠã®ããããã£ãããã©ã«ããªãã·ã§ã³ãšããŠã¹ãŒããŒã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããã®æ¹ãè¯ããšæããŸããããšãã°ãã¢ããªã«ã¯ãã€ã³ã¹ã¿ã³ã¹åæã«æž¡ãå¿ èŠã®ããåçãªïŒããŒã«ã©ã€ãºãããïŒã«ãŒãããããŸãããŸããroutesïŒïŒã¡ãœããã䜿çšããŠãæ©èœããŸããã äžæ¹ã以äžã¯
class Router extends Backbone.Router {
constructor (localizedRoutes) {
_.defaults(localizedRoutes, {
"nonLocalizedRouteA/": "routeA"
"*actions": "defaultRoute"
});
super({ routes: localizedRoutes });
}
ãããèŠãã°ããã§ãããã¢ãã«ãæã€idAttribute
ããããã£ã§ã¯ãäž¡æ¹ã®åé¿çãæ©èœããªããšæããŸãã Backboneã¯model.idAttribute
ã䜿çšããŠããããã£ã«ã¢ã¯ã»ã¹ãããããã¡ãœããã¯æ©èœããŸããã ãŸããã¢ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããªãã·ã§ã³ãšããŠã®ããããã£ã®è¿œå ãå®å
šã«ã¯ãµããŒãããŠããªãããã§ãã
idAttributeããããã£ã§ã¯äž¡æ¹ã®åé¿çãæ©èœããªããšæããŸã
ãã°ããããã£ããã§ããããã«å¯ŸåŠããPRã«åãçµã¿ãŸãã ãããŸã§ã®éãgetterè¡šèšã䜿çšããŠãã«ã¹ã¿ã idAttribute
ïŒããã³cidPrefix
ïŒãæäŸã§ããŸãã
class Model extends Backbone.Model {
get idAttribute() {
return '_id';
}
get cidPrefix() {
return '__c';
}
}
Backboneãmodel.idAttributeã䜿çšããŠããããã£ã«ã¢ã¯ã»ã¹ãããããã¡ãœããã¯æ©èœããŸãã
get idAttribute() { return '_id'; }
ã¯getterã¡ãœããã§ãããéåžžã®ããããã£ãšåãããã«ã¢ã¯ã»ã¹ãããŸãã this.idAttribute === '_id';
ã
ããã¯ãå€§å¹ ãªæžãçŽããå¿ èŠãªããã«èããå§ããŠããŸãã ããã¯ããŒã³v2ã¯ããããïŒ
ããã¯ãå€§å¹ ãªæžãçŽããå¿ èŠãªããã«èããå§ããŠããŸãã ããã¯ããŒã³v2ã¯ããããïŒ
ãŸã£ããããã§ã¯ãããŸããããES6ãµãã¯ã©ã¹åã¯ãã§ã«ãµããŒããããŠããŸãïŒ Modelsãé€ãïŒã 誰ãã@ akre54ã®éçããããã£ã®ææ¡ã調ã¹ããé¢çœããšæããŸãããå ã®æçš¿ã®2ã€ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããå¿ èŠãããŸããã
@jridgewell ãè¿ éãªè§£æ±ºçã«æè¬ããŸãïŒ
ãã®ã¹ã¬ããïŒå ·äœçã«ã¯Yehuda Katzã®ææ¡ïŒã§ãã³ã¬ãŒã¿ã«ã€ããŠèšåãããŠããŸããããããã§ãã®åé¡ã解決ãããã©ããã¯æªè§£æ±ºã§ããã
ç§ã¯ææ¡ã©ããã«ããããããã£ãŠããŸããããããŠããªãã¯ãã®ãããªãã³ã¬ãŒã¿ãæžãããšãã§ããŸãïŒ
function props(value) {
return function decorator(target) {
_.extend(target.prototype, value);
}
}
ãããŠãç§ãã¡ã䜿çšããŠããäŸã¯ã次ã®ããã«æžãããšãã§ããŸã
@props({
tagName: 'li',
className: 'document-row',
events: {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
}
})
class DocumentRow extends Backbone.View {
initialize() {
this.listenTo(this.model, "change", this.render);
}
render() {
//...
}
}
ããã¯ç§ã«ãšã£ãŠã¯ããŸãããããã§ãã ãã³ã¬ãŒã¿ã¯ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãå®è¡ãããåã«ã¯ã©ã¹ã«é©çšãããŸãã ããã¯åãªã宣èšåã®ããšããã§ã
class DocumentRow extends Backbone.View {
initialize() {
this.listenTo(this.model, "change", this.render);
}
render() {
//...
}
}
_.extend(DocumentRow.prototype, {
tagName: 'li',
className: 'document-row',
events: {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
}
})
å®éãç§ã¯ããããã¹ãããŠããŸããããéçãããããšãããã¿ã€ãããããã®äž¡æ¹ãå¿ èŠãªå Žåã¯ãããã¯ããŒã³æ¡åŒµæ©èœå šäœããã³ã¬ãŒã¿ã«ããããšãã§ããŸãã
æ®å¿µãªãããããã¯ä»ã®ãšããåãªãææ¡ã§ãããããã«ã¯å®éšçãªæã®åŸãã§ããããµããŒãããŠããã®ã§ã人ã ãåéºãæããŠãããªããããã¯ããã§å¯èœãªè§£æ±ºçã§ãã
@benmccormick ããã³ã¬ãŒã¿ãã¯ããã¯ã¯ç§ã«ãšã£ãŠããŸãæ©èœããŸãã ããã¯ä»ã®ãšããåãªãææ¡ã§ãã以å€ã«ããã®ã¢ãããŒããæ¡çšããããšã«ã€ããŠä»ã®æžå¿µã¯ãããŸããïŒ
@andrewrotaç§ã¯ä»ããã®ãããªãã®ããã©ããŒã¢ããããããã°æçš¿ãæåéãæžããŠããŸãïŒããªããã³ã¡ã³ããããšãã«ãã®ã¹ã¬ãããèªãã§ããŸããïŒã ããã¯å€§ããªã以å€ãã§ãããç§ã¯å人çã«ã¯äœãèŠãŠããŸããã å®éã«ã¯ãäžèšã§èª¬æãããã®ãããããŸãæ©èœãããã³ã¬ãŒã¿ã䜿çšããŠBackboneçšã®ããã€ãã®åªããæ°ããã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ãããšæããŸãã
ç§ãããã«ã€ããŠæåã«èãããããã@StevenLangbroekããã®ãã®èŠç¹ãåç §ããŠãã ããïŒ https ïŒ //gist.github.com/StevenLangbroek/6bd28d8201839434b843
ãããç§ãæçš¿ããŠãããã©ããŒã¢ããæçš¿ã®ãã¬ãã¥ãŒã§ãïŒ http ïŒ ä»ããæ°žä¹ ãªã³ã¯ã§æŽæ°
ä»é±åãã«æ°žç¶çãªURLã«ç§»åããŸãã ãããããã®ã¹ã¬ããããã®åºæ¬çãªèŠçŽãšç§ãåŠãã ããšã¯æ¬¡ã®ãšããã§ãã
ããã¯ããŒã³ããããã£ãçŸåšã®ES6ã¯ã©ã¹ä»æ§ã§æ©èœãããã«ã¯3ã€ã®ã¢ãããŒãããããŸãïŒæåã®2ã€ã¯å®å šã«ãµããŒããããŠãããšèŠãªãããããã«ïŒ3684ãå¿ èŠã§ãïŒã
ç§ã¯ãŸã ããããã¹ãŠãããçšåºŠè¡šçŸåãå¶éããŠãããšèŠãŠããŸãã ãããããã³ã¬ãŒã¿ãæ£åŒãªä»æ§ã«ãªãã°ãåé¡ã¯å€ããå°ãªãã解決ããããšæããŸãã ãã³ã¬ãŒã¿ã«ã¯ãããã«2ã€ã®ãªãã·ã§ã³ããããŸãã
ãããã®ãœãªã¥ãŒã·ã§ã³ã®ãããããïŒ3684以å€ã«Backboneã«è¿œå ã®å€æŽãå ããå¿ èŠã¯ãªããšæããŸããããã³ã¬ãŒã¿ãæšæºåãããå Žåãããã¯ããŒã³ãã³ã¬ãŒã¿ã©ã€ãã©ãªã«ã¯èå³æ·±ã圹å²ããããŸãã
æææ¥/ç«ææ¥ã«æçš¿ããåã«ãæçš¿ã«é¢ãããã£ãŒãããã¯ããåŸ ã¡ããŠããŸãã
@benmccormickä¿®æ£ã®ãããã§ããã³ã¬ãŒã¿ã¯æ§ç¯ãè¡ãããåã«è©äŸ¡ããããšæããŸããã èŠæšãå°ãæŽæ°ããŸãã ãŸãïŒããã°æçš¿ã§èšåããŠãããŠããããšã:)ããªãããããå ¬éãããšãã«ãã€ãã¿ãŒã§ç§ã«pingããŸããïŒ ïŒ+1ïŒ
ããªãªãããã®modelEvents
ãšcollectionEvents
ã«åãæ§æã䜿çšã§ããŸãããããªã¬ãŒã«ã¯äœ¿çšã§ããŸããã ãããã¯ã¯ã©ã¹ãã³ã¬ãŒã¿ïŒããã°æçš¿ã®tagNameãtemplateãªã©ïŒãä»ããŠå
¬éã§ããŸãããç§ã¯èããŠããŸããïŒããã«éçããããã£ã䜿çšããããšã¯ã§ããŸãããïŒ ãŸãã¯ãããã¯ããã¯ããŒã³ã§ã¯æ©èœããŸãããïŒ
ãã³ã¬ãŒã¿ã¯ãŸã ã¹ããŒãž0ã§ããããšã¯ç解ããŠããŸãããBackboneã¢ããªã®äœææ¹æ³ãç¹ã«ã€ãã³ãããã·ã¥ãããã¡ãœãããã³ã¬ãŒã¿ã®åªããã¢ããã°ã¬ãŒãã«ãªããšæããŸããããã¯ãããªã声ãããäžæ°é£²ã¿ã奜ããããªããã°ã©ãã³ã°ã¹ã¿ã€ã«ã§ãã
@StevenLangbroekéçããããã£ã®èª¬æã«ã€ããŠã¯ãäžèšãåç §ããŠãã ããã
çŸåšæå®ãããŠããæ§æã¯ããããã¿ã€ãã«è¿œå ããã®ã§ã¯ãªããåã€ã³ã¹ã¿ã³ã¹ã«ããŒã«ã«ããããã£ãäœæããŸãã ãããã®ããããã£ã¯ãã¹ãŒããŒã³ã³ã¹ãã©ã¯ã¿ãŒã®å®è¡åŸã«è¿œå ãããŸãã
@benmccormick ãæçš¿ã¯èŠæ ãããããåãªãã·ã§ã³ã®ãã¬ãŒããªãã説æããã®ã«è¯ãä»äºãããŠãããšæããŸãã ãã®æç¹ã§ãç§ã¯ç¹å¥ãªç®çã®ãã³ã¬ãŒã¿ã¢ãããŒããæ¬åœã«å¥œãã§ããããã³ã¬ãŒã¿ãä»æ§ã«çµã¿èŸŒãŸããŠãããšä»®å®ãããšããããæè¯ã®ã¢ãããŒãã®ããã§ãã
@benmccormickã®ãã³ã¬ãŒã¿ã¯ãããã¿ã€ãã§ã¯ãªãã³ã³ã¹ãã©ã¯ã¿ã§_#extend
ãåŒã³åºãã次ã«@ akre54ã®_.instOrStaticVar
ã¡ãœããã_#result
代ããã«äœ¿çšããå¿
èŠããããŸããïŒ ããã¯å£æ»
çãªå€åã«ãªããšæããŸãããç§èŠã§ã¯ããããã°ãã£ãšãããã«èŠããŸãã @ akre54ãææããããã«ããã®ããã«å®çŸ©ãããããããã£ã¯ãããã¿ã€ãã§å
±æãããæååãšãªããžã§ã¯ãïŒã€ãŸãããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§å
±æãããïŒã§ãããããã¯ã©ã¹ãä»ããŠã¢ã¯ã»ã¹ããå¿
èŠããããŸãã
ç§ã¯ããã«é²ãã§ãå¿ èŠãªæ¹æ³ã§ã¯ã©ã¹ã®ããããã£ãæ©èœãããŸãã ã¯ã©ã¹ããããã£ã«ã泚éãä»ããããšãã§ããè£ é£Ÿãããããããã£ããããã¿ã€ãã«ã¢ã¿ããããç¹å¥ãªãã³ã¬ãŒã¿ãäœæã§ããŸãã
class TodoView extends Backbone.View {
<strong i="6">@protoprop</strong>
static tagName = 'li';
}
function protoprop(target, name, descriptor) {
target.prototype[name] = descriptor.initializer()
}
äŸã瀺ããBabelREPLãåç §ããŠãã ããã ããã¯å®éšçãªãã®ã«äŸåããŠããŸãããæ©èœããŸãã
@ just-borisç§ã®ããã°ã®ã³ã¡ã³ãã§èª¬æãããŠããããã«ãããã§èŠãããåäœã«ã¯ãã¯ã©ã¹ããããã£ãšãã³ã¬ãŒã¿ä»æ§ã®Babelã®åŠçã®å®è£ ã®è©³çŽ°ããããŸãã çŸåšãã©ã®ææ¡ã§ããã®åäœã¯å®çŸ©ãããŠããŸããã ããªããéãšãããã®ããããå Žåã¯ãåé¡ã«ãããã§ããããããã§ãããã³/ãŸãã¯ãããã«ã¯ã©ã¹ã®ããããã£æšæºåãããè¡åã«ãã³ã¬ãŒã¿ãäœæããŸãã ããã§ãªããã°ãããªããããŠããããšã¯ãã€ã§ãå£ããå¯èœæ§ããããŸãïŒãããŠãããããããªãã§ãããïŒã
@benmccormick wycats / javascript-ãã³ã¬ãŒã¿ã«ã¯ãããããã£åæååã«é¢ããè¿œå ã®å®çŸ©ããã§ã«ãã
ããã§ã®äž»ãªæžå¿µäºé ã¯ãããããã£åæååãéåžžã®èšè¿°åãšã¯ã©ã¹ã¡ãœããã§ããããããã³ã¬ãŒã¿ãããããã©ããã§ããããšã§ãã ãã®ã»ã¯ã·ã§ã³ã®ä»æ§ã¯å€æŽãããŠããŸããããå¿é ããçç±ã¯ããããŸãã
ããããšãŠããã£ããããç§ã¯ãããèŠãŠããŸããã§ããã ãããææããŠãããŠããããšãã
11:29ææã2015幎9æ21æ¥ã«ã¯ãããªã¹Serdiuk [email protected]
æžããŸããïŒ
@benmccormick https://github.com/benmccormick
https://github.com/wycats/javascript-decoratorsã«ã¯ãã§ã«äœåãªãã®ããããŸã
ããããã£åæååã«é¢ããå®çŸ©
https://github.com/wycats/javascript-decorators/blob/master/INITIALIZER_INTEROP.md
ãããããã£åæååãéåžžã®èšè¿°åã§ãããšããäž»ãªæžå¿µäºé ã¯ã
ã¯ã©ã¹ã¡ãœããã ãã§ãªãããã³ã¬ãŒã¿ãããããã©ããã§ããŸãã èŠããªã
ãã®ã»ã¯ã·ã§ã³ã®ä»æ§ã¯å€æŽãããŠããŸããããå¿é ããçç±â
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/jashkenas/backbone/issues/3560#issuecomment -142015454
ã
https://github.com/typhonjs/backbone-es6ã®äœ¿çšãš@benmccormickã«ãã£ãŠææ¡ãããæ¹æ³ã®ææ³ã®é·æ/çæãç¥ãããã£ãã ãã§ãã
ãšããã§ããã°ãããããã°æçš¿ãããããšã@benmccormick ïŒ
ææ¡ïŒïŒ121ïŒãã«ãªã¯ãšã¹ãã«å ããŠãããã«properties
ã¡ãœãããå®è¡äžhttps://github.com/dsheiko/backbone-abstract/tree/master/demo-es6/src/Js
@ akre54ãè¿°ã¹ãããã«ããžã£ã¹ãã£ã³ã¯ãã§ã«åæ§ã®è§£æ±ºçãææ¡ããŠããŸãïŒ preInitialize
ã¡ãœããïŒã ãã§ã«ç§ã®ãã©ã³ãã§ããã䜿çšããŠããéãããã¯æ¬åœã«ç§ã«ãšã£ãŠåé¡ã解決ããŸãã 宣èšåã®ã¯ã©ã¹ããããã£ãçŠæ¢ããŠããªãã«ãããããããTypeScriptã§ã圹ç«ã€ããã«èŠããŸããã
PS preInitialize
ã¯ããäžè¬çã«èãããã®ã§ããã®ã³ã³ããã¹ãã§ã¯ããé©åã§ãã ãšã¯ãããã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã¹ãŠã®ãžã§ãã®åã«ã¡ãœãããåŒã³åºããšã preConstruct
ããã«ãªããŸãã
ãããã¿ã€ãã«ããããèšå®ããæ°ããã¯ã©ã¹ããããã£ã®ææ¡ã衚瀺ãããããšãæ¬åœã«æãã§ããŸãã ææ¡ã«é¢ãã£ãŠããå€ãã®äººããã®åœ±é¿ãå¿é ããŠããããã§ãããjeffmoã®ææ¡ãããããã³ã³ã¹ãã©ã¯ã¿ãŒã«å ¥ããŠããã®ã«å¯Ÿããã¯ã©ã¹ã¡ãœããããããã¿ã€ãã«çŽæ¥ã¢ã¿ãããããããšã¯éåžžã«äžè²«æ§ããããŸããã
ããããã£ããããã¿ã€ãã«çŽæ¥ã¢ã¿ããããããšã§ãã»ãšãã©ãã¹ãŠã®React / Backboneã³ãŒããES2015ã¯ã©ã¹ã«ç§»è¡ã§ããããã«ãªããŸãã
çŽ æŽãããããã°æçš¿@benmccormick !! ç§ã®ãããžã§ã¯ãã§ãããã®ãã³ã¬ãŒã¿ã䜿çšããäºå®ã§ã
@benmccormick ãããã©ã«ãã®ããããã£ã§ã¯ã©ã¹ã宣èšããå¥ã®æ¹æ³ãèããŸãããhttps ïŒ
ããã¯ãã¯ã©ã¹ããã€ãã£ãã«ãµããŒãããé©åã«çºçããã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯å®£èšåŸã«ã¯ã©ã¹ãå®çŸ©ãããããã¯ããã«èŠæ ãã®ããç°å¢ã§éåžžå®è¡ãããŸãã ES2016 / ES2017ã®ãã€ãã©ã€ã³ã«ç»å Žãããã³ã¬ãŒã¿ãšã¯ã©ã¹ããããã£ã®ææ¡ã«ãããããã¯Backboneã®é·æçãªãœãªã¥ãŒã·ã§ã³ãããåŠè¡çãªæŒç¿ã«ãªãå¯èœæ§ããããŸããã2ã3幎ãé·ãããå Žåã¯ããã®ãããªãã®ãééããªãå®è¡å¯èœãªãªãã·ã§ã³ã§ããåŸ ã€ã
å®ã¯ãã¯ã©ã¹ããããã£ã¯ãŸã EcmascriptããããŒã¶ã«ã¹ããŒãžã·ã¹ãã ã®ã¹ããŒãž1ã«ãããŸãã ããŠãŒã¶ãŒãäœãåŸãã®ãããšããç¹ã§ã¯ãããã¯ã¡ãã£ãšããããšã®ããã«æãããã®ã§ãçç±ã¯ããããŸããã ãã¡ãããæ§æçã«ããªãã¡ã¬ã³ã¹å®è£ ã®èŠ³ç¹ããããå éšã§ã©ã®ãããªããšãå£ãããã¯ããããŸããã
https://github.com/tc39/ecma262
https://github.com/jeffmo/es-class-fields-and-static-properties
ãããèªãã§ã httpsïŒ//github.com/epicmiller/es2015-default-class-propertiesãè¯ãã¢ãããŒãã ãšæããŸãã è©ŠããŠã¿ããšãBackboneã«ããã«å¯Ÿããçµã¿èŸŒã¿ã®ãµããŒããããããšã«æ°ã¥ããŸããã äŸãã°ïŒ
class MyModel extends Backbone.Model.extend({
idAttribute: 'id'
}) {
// ...
};
äžèšã®ã³ãŒãã¯ãMyModel.prototype.idAttributeãé©åã«èšå®ããŸãã TypeScriptã®å Žåãã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã€ã³ã¿ãŒãã§ã€ã¹ãè¿ãããã«å®£èšãã¡ã€ã«ãå°ã調æŽããå¿ èŠããããŸãããããã¯ES6ãŠãŒã¶ãŒã«ã¯é¢ä¿ã®ãªã詳现ã§ã...
@ t-beckmannã¯éåžžã«åªãããœãªã¥ãŒã·ã§ã³ã§ããèŠãç®ã¯èªã¿ããããå€æŽã¯æå°éã§æžã¿ãŸãã ããããšãïŒ
ãã®ã¹ã¬ããã¯2幎åã«è¡ãããŠããããšãèªèããŠããŸãããBackboneïŒES6ã¯ã©ã¹ãæ€çŽ¢ããå Žåã§ãããããïŒãã€å¯äžïŒã®çµæã®1ã€ã§ãããããã§äœåºŠãèšåãããŠããã¯ã©ã¹ããããã£ãå©çšããæœåšçãªãœãªã¥ãŒã·ã§ã³ãå ±æããããšæããŸããã ã
ã¯ã©ã¹ããããã£ãã¹ããŒãž2ã«ãããbabelããªã»ããã§åºãå©çšã§ããããã«ãªã£ãã®ã§ãããäžåºŠèŠãŠã¿ãããšæããŸããã åè¿°ã®ããã«ãã€ã³ã¹ã¿ã³ã¹/ã¡ã³ããŒããããã£ã®åé¡ã¯ã_after_ constructor()
ãŸã§ãããã¿ã€ãã«é©çšãããªãããšã§ãããèšå®ããå¿
èŠã®ããããããã£ã®å€ãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒå
ã§äœ¿çšãããŸãã éçããããã£ã¯ããã«é©çšãããŸãããïŒèšèšäžïŒã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ã³ããŒãããŸããã
次ã®shimã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãå®è¡ããåã«ãéçããããã£ãã³ã³ã¹ãã©ã¯ã¿ãŒããã€ã³ã¹ã¿ã³ã¹ã«ã³ããŒããŸãïŒäºå®äžãæ°ããã³ã³ã¹ãã©ã¯ã¿ãŒãäœæããããããã£ãé©çšããŠãããå ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãå®è¡ããŸãïŒã ããã¯ééããªãããã¯ã§ãããç§ã¯çµæã«ããªãæºè¶³ããŠããŸãïŒ
ã·ã ïŒ
export default function StaticShim(Ctor) {
const NewCtor = function shim(...args) {
Object.keys(Ctor).forEach((key) => {
if (this[key] === undefined) {
this[key] = toApply[key];
}
});
Object.assign(this, this.constructor);
Ctor.apply(this, args);
};
NewCtor.prototype = Object.create(Ctor.prototype);
NewCtor.prototype.constructor = NewCtor;
Object.keys(Ctor).forEach((key) => {
if (NewCtor[key] === undefined) {
NewCtor[key] = Ctor[key];
}
});
return NewCtor;
}
ãããŠäœ¿çšæ³ïŒ
class TestModel extends StaticShim(Backbone.Model) {
static idAttribute = '_id';
static urlRoot = '/posts';
initialize() {
console.log(this.url()); // Correctly logs "/posts/{id}"
}
}
ãããä»ã®èª°ããå©ãããã誰ããããã«ã€ããŠäœãèããæã£ãŠããå Žåã«åããŠãããã«ããããããããããã£ãã ãã§ãã ããããšãïŒ
å€ãåé¡ã埩掻ãããŠç³ãèš³ãããŸããã
ES6ã¯ã©ã¹å®£èšãBackboneã*ãextendïŒ{...}ïŒã䜿çšããããã«å€æããbabelãã©ã°ã€ã³ãäœæããããšã¯å¯èœã§ããããããããšã䟡å€ããããŸããïŒ
@enziousã¯ééããªãå¯èœã®ããã§ãã ããã䟡å€ããããã©ããã¯ããªã次第ã§ã:)
@ t-beckmannã®ãœãªã¥ãŒã·ã§ã³ã¯æãç°¡åãªããã§ãã ãããããã¯ããŒã³èªäœã«çµ±åããå¿ èŠããããŸããïŒ
ç§ã«ãšã£ãŠã¯æ£ããèŠããŸããããidAttributeãèšå®ããã¡ãœãããããæ¹ãé©åã§ã¯ãªãã§ããããã
ããã«ãPromiseã®ãµããŒããããã°çŽ æŽãããã§ãããã ããã¯ãç§ãå人çã«Backboneå ã§éæšå¥šã«ãªãããšãæãã§ããjqueryDeferredã䜿çšããããããã€ãã£ããªã¢ãããŒãã§ãã
ããã§ã®è©±ã¯ãææ°ã®ããŒã«ãšèšèªæ©èœãå©çšããããã«ã¬ã¬ã·ãŒããã¯ããŒã³ã¢ããªã±ãŒã·ã§ã³ãæŽæ°ããããšã«ã€ããŠã¯ãŸã éåžžã«äžæ確ã§ãã Symbol.iteratorã®ãããªãã®ãå®è£ ãããŠããã補åãªãªãŒã¹ã§ã¯å©çšã§ããªãã®ãèŠãã®ã¯ç¹ã«æ®å¿µã§ãã
ãã®è³ªåã«å¯Ÿããããæ確ãªçãããŸã æ¢ããŠãã人ã®ããã«ãç§ã¯TypeScriptãããã¯ããŒã³ã¢ããªã«è¿œå ããŠããããã®ã³ã¡ã³ãããã®è§£æ±ºçãæã圹ç«ã€ããšãããããŸããã
ãããŸã§ã®ãšãããååã«æ©èœããŠããŸãããããé©åãªæšè«ãè¡ãã®ã§ã¯ãªãããã³ã¬ãŒã¿ãééããããããã£ã«æ瀺çã«æ³šéãä»ããå¿ èŠããããšããæ¬ ç¹ããããŸãã
export function Props<T extends Function>(props: { [x:string]: any }) {
return function decorator(ctor: T) {
Object.assign(ctor.prototype, props);
};
}
@Props({
routes: {
home: "home",
about: "about",
dashboard: "dashboard",
blog: "blog",
products: "products",
accountSettings: "accountSettings",
signOut: "signOut",
},
})
export class Router extends Backbone.Router {
home() {}
about() {}
// ...
}
@Props({
model: CategoryModel,
comparator: (item: CategoryModel) => item.display_value,
})
export class CategoryCollection extends Backbone.Collection<CategoryModel> {}
æ瀺çã«ããããã£ã¢ãããŒã·ã§ã³ã®äŸïŒ
@ raffomania ã @ jridgewell ïŒCoãããã®äŸ¡å€ã«ã€ããŠãç§ã®ããŒã ã¯ã¯ã©ã¹å€ã®ãããã¿ã€ãã«idAttributeãè¿œå ããããšã§ãã®åé¡ãåé¿ããŸããã
ã¯ã©ã¹Exampleã¯ParentExampleãæ¡åŒµããŸã{
//ããã«ã¯ã©ã¹ã¡ãœãããªã©
}
x.Example =äŸ;
x.Example.prototype.idAttribute = 'customIdAttr';
@kamsciãã®ãã©ã³ãã§ãåãããšãè¡ããBackboneãES6ã¯ã©ã¹ã«å€æããŸãã
ããã¯ããŒã³ã¯_configuration_ã䜿çšããŠãæ§æãªããžã§ã¯ãã_declarative_ã«ãªãããã«ããŸãã ããã¯çŽ æŽãããããšã§ãããç¶æ¿ã§ããŸãæ©èœããããšã¯æ±ºããŠãããŸããã ïŒã¯ã©ã¹ã®ã¯ããŒã³ãäœæããŠããæ§æããŸããããã¯ç¶æ¿ã§ã¯ãããŸãããïŒ
ããã¯ããŒã³ã䜿çšããŠæ°ããã³ãŒããäœæããå Žåã¯ãå¥ã®èãæ¹ãããŠãããŸããŸããã ES5ã³ãŒããåãåã£ãŠè²Œãä»ããŠãããES6ãæ©èœããªãããã«èŠããŸãã ã ããäœïŒ
configãªããžã§ã¯ããä»ããŠãã¹ãŠãæž¡ãã®ã«ãŸã£ããåé¡ã¯ãããŸããã ãã®æ§æã®å 容ãã©ã®ããã«å ¬éãããããŸãã¯èªã¿ããããæäœãããããããã¯ãæ³£ãã®ã§ã¯ãªãã解決ããããã®åé¡ã§ãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã2åå®è¡ããå¿ èŠã¯ãããŸããã ããã¯ã°ãããŠããŸãã ããããã®ãã¿ãŒã³
Foo = BackboneThing.extendïŒ{LONG DECLARATIVE OBJECT LITERAL}ïŒãæ¯èŠªãæããéãã§ãã ããªãã¯çããããã©ãã»ã©éãã®ãããããªãã»ã©é·ãéããããã£ãŠããŸãã
åèïŒç§ã¯å€§èŠæš¡ãªMarionetteãããžã§ã¯ããæã£ãŠãããES6æ§æã䜿çšããããšèããŠããŸããã Backboneextends宣èšãES6ã¯ã©ã¹ã«å€æããjscodeshiftãã©ã³ã¹ãã©ãŒããŒãäœæããŸããã ããã¯å€ãã®åçŽåãããä»®å®ãããŸãããããã§ãåºçºç¹ãšããŠã ãã§ãããšããŠããããªãã®äœäººãã«ãšã£ãŠã¯åœ¹ã«ç«ã€ãããããŸããã ããã¯ããã³ã¬ãŒã¿ã§åé¡ãçºçãããšãã«@ t-beckmannã«ãã£ãŠææ¡ãããæ§æã«åŸããŸãã
https://gist.github.com/maparent/83dfd65a37aaaabc4072b30b67d5a05d
ç§ã«ã¯ããã®ã¹ã¬ããã«å¥åŠãªèª€ç§°ãããããã«æãããŸãã ES6ã®ãéçããããã£ãã¯ãã€ã³ã¹ã¿ã³ã¹åããã«ã¯ã©ã¹ã«ååšããã³ã³ã¹ãã©ã¯ã¿ãŒã®ããããã£ã§ãïŒããšãã°ãClass.extendïŒã ãã®ã¹ã¬ããã§ã¯ããéçããããã£ãã¯ãéçãå€ãæã€ãããã¿ã€ãã®ååä»ãå±æ§ãåç §ããŠããããã§ãïŒã²ãã¿ãŒãé¢æ°ã§ã¯ãããŸããïŒã ç§ã¯ãããæ£ããç解ããŸãããïŒ
éçãªå€ãæã€ãããã¿ã€ãããããã£ã®å Žåãããã¯ããŒã³ã®åæååã®å€ãé¢æ°ã®æ»ãå€ãšããŠå®£èšããããšã¯éåžžã«ç°¡åãªç§»è¡ã§ããã_ãresultãããã©ã«ããclassNameãidãªã©ã§æåŸ ã©ããã«æ©èœããããã«æ©èœããŸããä»ã®ã€ã³ã¹ã¿ã³ã¹ããããã£ã¯ã§æ£åžžã«å®£èšãããŠããããã§ããåæåé¢æ°ã®äžéšã¯éåžžã©ããã§ãã ãã®åé¡ã¯ãES6ã¯ã©ã¹ã§ã¯çŸåšéçãªå€ã§ãããã¿ã€ãããããã£ãå®çŸ©ã§ãããã²ãã¿ãŒãã»ãã¿ãŒãããã³é¢æ°ã®ã¿ãå®çŸ©ã§ããããã«ã®ã¿çºçããããã§ãã
ãããã«ãããã³ã³ã¹ãã©ã¯ã¿ãŒ/ã¯ã©ã¹ã®éçããããã£ïŒClass.extendïŒã¯ãES6ã®å Žåã®ããã«ããã¯ããŒã³ã«ç¶æ¿ãããŸããã ããã¯ããŒã³ã¯ãES6ã®ããã«ãããã®ããããã£ãç¶æ¿ããã®ã§ã¯ãªããextendé¢æ°ãå®è¡ãããã³ã«ãã¯ã©ã¹ã®éçããããã£ãæ°ããã¯ã©ã¹/ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã³ããŒããŸãã ããã§ãããä¿®æ£ããããã®PRãäœæããŸããhttps://github.com/jashkenas/backbone/pull/4235
ç§ã¯ããã€ãã®ã³ã¡ã³ã/ãã£ãŒãããã¯ãããã ããã°å¹žãã§ãããããäœããå£ããã©ããã¯ããããŸãããç§ã¯ãããããªããã¹ãããŸããããããŠããã¯ããŸãããããã§ãã ããã¯ããŒã³ã¯ã©ã¹ã¯ãæ°ããåã³ã³ã¹ãã©ã¯ã¿ãŒãžã®åç §ãã³ããŒããã®ã§ã¯ãªããåŸã§Class.extendãç¶æ¿ããŸãã
æãåèã«ãªãã³ã¡ã³ã
ãããèªãã§ã httpsïŒ//github.com/epicmiller/es2015-default-class-propertiesãè¯ãã¢ãããŒãã ãšæããŸãã è©ŠããŠã¿ããšãBackboneã«ããã«å¯Ÿããçµã¿èŸŒã¿ã®ãµããŒããããããšã«æ°ã¥ããŸããã äŸãã°ïŒ
äžèšã®ã³ãŒãã¯ãMyModel.prototype.idAttributeãé©åã«èšå®ããŸãã TypeScriptã®å Žåãã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã€ã³ã¿ãŒãã§ã€ã¹ãè¿ãããã«å®£èšãã¡ã€ã«ãå°ã調æŽããå¿ èŠããããŸãããããã¯ES6ãŠãŒã¶ãŒã«ã¯é¢ä¿ã®ãªã詳现ã§ã...