Skip to content

Instantly share code, notes, and snippets.

@fishermand46
Created October 19, 2014 19:01
Show Gist options
  • Select an option

  • Save fishermand46/fd61573f81f84965cdaf to your computer and use it in GitHub Desktop.

Select an option

Save fishermand46/fd61573f81f84965cdaf to your computer and use it in GitHub Desktop.

Revisions

  1. fishermand46 created this gist Oct 19, 2014.
    235 changes: 235 additions & 0 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,235 @@
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=utf-8 />
    <title>JS Bin</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v1.3.0.js"></script>
    <script src="http://builds.emberjs.com/tags/v1.7.0/ember.js"></script>
    <script src="http://builds.emberjs.com/tags/v1.0.0-beta.9/ember-data.min.js"></script>
    </head>
    <body>
    <script type="text/x-handlebars" data-template-name="application">
    <h1>ember-latest jsbin</h1>
    {{outlet}}
    </script>
    <script type="text/x-handlebars" data-template-name="index">
    <h2>Apple Ratings</h2>
    <ul>
    {{#each persistedModels}}
    <li>{{apple-item model=this}}</li>
    {{/each}}
    </ul>
    {{input placeholder="Name..." value=newApple.name}}
    {{input placeholder="Rating..." value=newApple.rating}}
    <button {{action "saveApple" newApple}}>Save</button>
    </script>

    <script type="text/x-handlebars" data-template-name="components/apple-item">
    <p>{{model.name}}: {{model.rating}}</p>
    <button {{action "incrementRating" model}}>Increment Rating</button>
    <button {{action "saveRating" model}}>Save Rating</button>
    {{viewState}}
    </script>
    <script id="jsbin-javascript">
    App = Ember.Application.create();
    App.ApplicationAdapter = DS.FixtureAdapter;

    Ember.computed.filterIgnoreSpuriousChanges = function(dependentKey, callback) {
    var didPropertyChange = function(item, changeMeta) {
    var previousValues = changeMeta.previousValues;
    var observedProperty;
    if(!previousValues) { return true; }
    observedProperty = Object.keys(previousValues)[0];

    return item.get(observedProperty) !== previousValues[observedProperty];
    };
    var options = {
    initialize: function (array, changeMeta, instanceMeta) {
    instanceMeta.filteredArrayIndexes = new Ember.SubArray();
    },

    addedItem: function(array, item, changeMeta, instanceMeta) {
    if(!didPropertyChange(item, changeMeta)) { return array; }
    var match = !!callback.call(this, item),
    filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match);

    if (match) {
    array.insertAt(filterIndex, item);
    }

    return array;
    },

    removedItem: function(array, item, changeMeta, instanceMeta) {
    if(!didPropertyChange(item, changeMeta)) { return array; }
    var filterIndex = instanceMeta.filteredArrayIndexes.removeItem(changeMeta.index);

    if (filterIndex > -1) {
    array.removeAt(filterIndex);
    }

    return array;
    }
    };

    return Ember.arrayComputed(dependentKey, options);
    };

    App.Apple = DS.Model.extend({
    name: DS.attr('string'),
    rating: DS.attr('number')
    });

    App.Apple.FIXTURES = [
    {id: 1, name: 'Granny Smith', rating: 7},
    {id: 2, name: 'Fuji', rating: 10},
    {id: 3, name: 'Gala', rating: 6}
    ];

    App.IndexRoute = Ember.Route.extend({
    model: function() {
    return this.store.find('apple');
    }
    });

    App.NewAppleRoute = Ember.Route.extend({
    model: function() {
    return this.store.createRecord('apple');
    }
    });

    App.IndexController = Ember.Controller.extend({
    initialize: Ember.observer(function() {
    this.set('newApple', this.store.createRecord('apple'));
    }).on('init'),
    persistedModels: Ember.computed.filter('[email protected]', function(model) {
    return !model.get('isNew');
    }),
    // persistedModels: Ember.computed.filterBy('model', 'isNew', false),

    actions: {
    saveApple: function(model) {
    model.save();
    Ember.run.scheduleOnce('afterRender', function() {
    this.set('newApple', this.store.createRecord('apple'));
    }.bind(this));
    }
    }
    });

    App.AppleItemComponent = Ember.Component.extend({
    viewState: 'initalState',
    actions: {
    incrementRating: function(model) {
    this.set('viewState', 'newState');
    model.incrementProperty('rating');
    },
    saveRating: function(model) {
    model.save();
    }
    }
    });
    </script>



    <script id="jsbin-source-javascript" type="text/javascript">App = Ember.Application.create();
    App.ApplicationAdapter = DS.FixtureAdapter;

    Ember.computed.filterIgnoreSpuriousChanges = function(dependentKey, callback) {
    var didPropertyChange = function(item, changeMeta) {
    var previousValues = changeMeta.previousValues;
    var observedProperty;
    if(!previousValues) { return true; }
    observedProperty = Object.keys(previousValues)[0];

    return item.get(observedProperty) !== previousValues[observedProperty];
    };
    var options = {
    initialize: function (array, changeMeta, instanceMeta) {
    instanceMeta.filteredArrayIndexes = new Ember.SubArray();
    },

    addedItem: function(array, item, changeMeta, instanceMeta) {
    if(!didPropertyChange(item, changeMeta)) { return array; }
    var match = !!callback.call(this, item),
    filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match);

    if (match) {
    array.insertAt(filterIndex, item);
    }

    return array;
    },

    removedItem: function(array, item, changeMeta, instanceMeta) {
    if(!didPropertyChange(item, changeMeta)) { return array; }
    var filterIndex = instanceMeta.filteredArrayIndexes.removeItem(changeMeta.index);

    if (filterIndex > -1) {
    array.removeAt(filterIndex);
    }

    return array;
    }
    };

    return Ember.arrayComputed(dependentKey, options);
    };

    App.Apple = DS.Model.extend({
    name: DS.attr('string'),
    rating: DS.attr('number')
    });

    App.Apple.FIXTURES = [
    {id: 1, name: 'Granny Smith', rating: 7},
    {id: 2, name: 'Fuji', rating: 10},
    {id: 3, name: 'Gala', rating: 6}
    ];

    App.IndexRoute = Ember.Route.extend({
    model: function() {
    return this.store.find('apple');
    }
    });

    App.NewAppleRoute = Ember.Route.extend({
    model: function() {
    return this.store.createRecord('apple');
    }
    });

    App.IndexController = Ember.Controller.extend({
    initialize: Ember.observer(function() {
    this.set('newApple', this.store.createRecord('apple'));
    }).on('init'),
    persistedModels: Ember.computed.filter('[email protected]', function(model) {
    return !model.get('isNew');
    }),
    // persistedModels: Ember.computed.filterBy('model', 'isNew', false),

    actions: {
    saveApple: function(model) {
    model.save();
    Ember.run.scheduleOnce('afterRender', function() {
    this.set('newApple', this.store.createRecord('apple'));
    }.bind(this));
    }
    }
    });

    App.AppleItemComponent = Ember.Component.extend({
    viewState: 'initalState',
    actions: {
    incrementRating: function(model) {
    this.set('viewState', 'newState');
    model.incrementProperty('rating');
    },
    saveRating: function(model) {
    model.save();
    }
    }
    });</script></body>
    </html>
    98 changes: 98 additions & 0 deletions jsbin.pudaz.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,98 @@
    App = Ember.Application.create();
    App.ApplicationAdapter = DS.FixtureAdapter;

    Ember.computed.filterIgnoreSpuriousChanges = function(dependentKey, callback) {
    var didPropertyChange = function(item, changeMeta) {
    var previousValues = changeMeta.previousValues;
    var observedProperty;
    if(!previousValues) { return true; }
    observedProperty = Object.keys(previousValues)[0];

    return item.get(observedProperty) !== previousValues[observedProperty];
    };
    var options = {
    initialize: function (array, changeMeta, instanceMeta) {
    instanceMeta.filteredArrayIndexes = new Ember.SubArray();
    },

    addedItem: function(array, item, changeMeta, instanceMeta) {
    if(!didPropertyChange(item, changeMeta)) { return array; }
    var match = !!callback.call(this, item),
    filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match);

    if (match) {
    array.insertAt(filterIndex, item);
    }

    return array;
    },

    removedItem: function(array, item, changeMeta, instanceMeta) {
    if(!didPropertyChange(item, changeMeta)) { return array; }
    var filterIndex = instanceMeta.filteredArrayIndexes.removeItem(changeMeta.index);

    if (filterIndex > -1) {
    array.removeAt(filterIndex);
    }

    return array;
    }
    };

    return Ember.arrayComputed(dependentKey, options);
    };

    App.Apple = DS.Model.extend({
    name: DS.attr('string'),
    rating: DS.attr('number')
    });

    App.Apple.FIXTURES = [
    {id: 1, name: 'Granny Smith', rating: 7},
    {id: 2, name: 'Fuji', rating: 10},
    {id: 3, name: 'Gala', rating: 6}
    ];

    App.IndexRoute = Ember.Route.extend({
    model: function() {
    return this.store.find('apple');
    }
    });

    App.NewAppleRoute = Ember.Route.extend({
    model: function() {
    return this.store.createRecord('apple');
    }
    });

    App.IndexController = Ember.Controller.extend({
    initialize: Ember.observer(function() {
    this.set('newApple', this.store.createRecord('apple'));
    }).on('init'),
    persistedModels: Ember.computed.filter('[email protected]', function(model) {
    return !model.get('isNew');
    }),
    // persistedModels: Ember.computed.filterBy('model', 'isNew', false),

    actions: {
    saveApple: function(model) {
    model.save();
    Ember.run.scheduleOnce('afterRender', function() {
    this.set('newApple', this.store.createRecord('apple'));
    }.bind(this));
    }
    }
    });

    App.AppleItemComponent = Ember.Component.extend({
    viewState: 'initalState',
    actions: {
    incrementRating: function(model) {
    this.set('viewState', 'newState');
    model.incrementProperty('rating');
    },
    saveRating: function(model) {
    model.save();
    }
    }
    });