diff --git a/js/compiler/compiler.js b/js/compiler/compiler.js index 69b4b8a..5eaa12f 100644 --- a/js/compiler/compiler.js +++ b/js/compiler/compiler.js @@ -55,9 +55,9 @@ function buildActor(nameExpOpt, block, withReact) { } function reactWrap(blockCode) { - return '{ Syndicate.Actor.Facet.build((function () { ' + + return '{ Syndicate.Actor.Facet.build(function () { ' + blockCode + - ' }).bind(this)); }'; + ' }); }'; } function buildOnEvent(isTerminal, eventType, subscription, projection, bindings, body) { diff --git a/js/compiler/demo-bad-this.js b/js/compiler/demo-bad-this.js new file mode 100644 index 0000000..8a5990c --- /dev/null +++ b/js/compiler/demo-bad-this.js @@ -0,0 +1,59 @@ +// bin/syndicatec compiler/demo-bad-this.js | node +// +// Bug with this-ness. Symptomatic output: +// +// + render one false +// + render two false +// present one +// - render one false +// - render two false +// + render one one +// + render two one +// +// Good output: +// +// + render one false +// + render two false +// present one +// - render one false +// + render one one + +var Syndicate = require('./src/main.js'); + +assertion type user(who); +assertion type present(who); +assertion type rendered(who, isPresent); + +ground dataspace { + actor { + assert user('one'); + assert present('one'); + } + + actor { + assert user('two'); + // assert present('two'); + } + + actor { + during user($who) { + field this.isPresent = false; + on asserted present(who) { + console.log('present', who); + this.isPresent = who; + } + on retracted present(who) { + console.log('absent', who); + this.isPresent = false; + } + assert rendered(who, this.isPresent); + } + } + + actor { + during rendered($who, $isPresent) { + on start { console.log('+ render', who, isPresent); } + on stop { console.log('- render', who, isPresent); } + } + } +} diff --git a/js/src/actor.js b/js/src/actor.js index fb65965..cf1de18 100644 --- a/js/src/actor.js +++ b/js/src/actor.js @@ -139,7 +139,9 @@ Facet.current = null; Facet.build = function(f) { var facet = new Facet(Dataspace.activeBehavior()); - withCurrentFacet(facet, f); + withCurrentFacet(facet, function () { + f.call(facet.fields); + }); facet.completeBuild(); };