Skip to content

Instantly share code, notes, and snippets.

@sukima
Last active August 5, 2020 21:27
Show Gist options
  • Save sukima/30502d5a4c18aa0d52b39947d452793f to your computer and use it in GitHub Desktop.
Save sukima/30502d5a4c18aa0d52b39947d452793f to your computer and use it in GitHub Desktop.

Revisions

  1. sukima revised this gist Aug 5, 2020. 3 changed files with 44 additions and 26 deletions.
    60 changes: 39 additions & 21 deletions controllers.application\.js
    Original file line number Diff line number Diff line change
    @@ -1,30 +1,48 @@
    import Controller from '@ember/controller';
    import EmberObject from '@ember/object';
    import EmberObject, { action } from '@ember/object';

    function logged(target, key, descriptor) {
    let _value = descriptor.initializer?.();
    console.log({ target, key, descriptor, _value });
    descriptor.get = function() {
    console.log(`Get ${key}`); // DOES NOT LOG!
    return _value;
    };
    descriptor.set = function(value) {
    console.log(`Set ${key}`); // DOES NOT LOG!
    return (_value = value);
    };
    return descriptor;
    function trackedData(key, initializer) {
    let values = new WeakMap();
    let hasInitializer = typeof initializer === 'function';

    function getter(self) {
    let value;
    if (hasInitializer && !values.has(self)) {
    value = initializer.call(self);
    values.set(self, value);
    } else {
    value = values.get(self);
    }
    return value;
    }

    function setter(self, value) {
    self.notifyPropertyChange(key);
    values.set(self, value);
    }

    return { getter, setter };
    }

    class Foo extends EmberObject {
    @logged foobar = 'FOOBAR';
    function legacyTracked(target, key, descriptor) {
    let { getter, setter } = trackedData(key, descriptor?.initializer);
    return {
    enumerable: true,
    configurable: true,
    get() {
    return getter(this);
    },
    set(newValue) {
    setter(this, newValue);
    },
    };
    }

    export default class ApplicationController extends Controller {
    init() {
    super.init(...arguments);
    let foo = Foo.create();
    console.log(`Result 1: ${foo.foobar}`);
    foo.foobar = 'BARFOO';
    console.log(`Result 2: ${foo.foobar}`);
    @legacyTracked appName = 'FOOBAR';

    @action
    testIt() {
    this.appName = 'BARFOO';
    }
    }
    2 changes: 1 addition & 1 deletion templates.application\.hbs
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    <h1>Welcome to {{this.appName}}</h1>
    <br>
    <br>
    {{outlet}}
    <button type="button" {{on "click" this.testIt}}>Click!</button>
    <br>
    <br>
    8 changes: 4 additions & 4 deletions twiddle\.json
    Original file line number Diff line number Diff line change
    @@ -12,11 +12,11 @@
    },
    "dependencies": {
    "jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js",
    "ember": "3.18.1",
    "ember-template-compiler": "3.18.1",
    "ember-testing": "3.18.1"
    "ember": "3.12.2",
    "ember-template-compiler": "3.12.2",
    "ember-testing": "3.12.2"
    },
    "addons": {
    "@glimmer/component": "1.0.0"
    }
    }
    }
  2. sukima revised this gist Aug 5, 2020. 1 changed file with 3 additions and 1 deletion.
    4 changes: 3 additions & 1 deletion controllers.application\.js
    Original file line number Diff line number Diff line change
    @@ -23,6 +23,8 @@ export default class ApplicationController extends Controller {
    init() {
    super.init(...arguments);
    let foo = Foo.create();
    console.log(`Result: ${foo.foobar}`);
    console.log(`Result 1: ${foo.foobar}`);
    foo.foobar = 'BARFOO';
    console.log(`Result 2: ${foo.foobar}`);
    }
    }
  3. sukima revised this gist Aug 5, 2020. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions controllers.application\.js
    Original file line number Diff line number Diff line change
    @@ -5,11 +5,11 @@ function logged(target, key, descriptor) {
    let _value = descriptor.initializer?.();
    console.log({ target, key, descriptor, _value });
    descriptor.get = function() {
    console.log(`Get ${key}`);
    console.log(`Get ${key}`); // DOES NOT LOG!
    return _value;
    };
    descriptor.set = function(value) {
    console.log(`Set ${key}`);
    console.log(`Set ${key}`); // DOES NOT LOG!
    return (_value = value);
    };
    return descriptor;
  4. sukima created this gist Aug 5, 2020.
    28 changes: 28 additions & 0 deletions controllers.application\.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,28 @@
    import Controller from '@ember/controller';
    import EmberObject from '@ember/object';

    function logged(target, key, descriptor) {
    let _value = descriptor.initializer?.();
    console.log({ target, key, descriptor, _value });
    descriptor.get = function() {
    console.log(`Get ${key}`);
    return _value;
    };
    descriptor.set = function(value) {
    console.log(`Set ${key}`);
    return (_value = value);
    };
    return descriptor;
    }

    class Foo extends EmberObject {
    @logged foobar = 'FOOBAR';
    }

    export default class ApplicationController extends Controller {
    init() {
    super.init(...arguments);
    let foo = Foo.create();
    console.log(`Result: ${foo.foobar}`);
    }
    }
    6 changes: 6 additions & 0 deletions templates.application\.hbs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,6 @@
    <h1>Welcome to {{this.appName}}</h1>
    <br>
    <br>
    {{outlet}}
    <br>
    <br>
    22 changes: 22 additions & 0 deletions twiddle\.json
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,22 @@
    {
    "version": "0.17.1",
    "EmberENV": {
    "FEATURES": {},
    "_TEMPLATE_ONLY_GLIMMER_COMPONENTS": false,
    "_APPLICATION_TEMPLATE_WRAPPER": true,
    "_JQUERY_INTEGRATION": true
    },
    "options": {
    "use_pods": false,
    "enable-testing": false
    },
    "dependencies": {
    "jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js",
    "ember": "3.18.1",
    "ember-template-compiler": "3.18.1",
    "ember-testing": "3.18.1"
    },
    "addons": {
    "@glimmer/component": "1.0.0"
    }
    }