Class Ember.ObjectProxy

Ember.ObjectProxy forwards all properties not defined by the proxy itself to a proxied content object.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
object = Ember.Object.create({
  name: 'Foo'
});

proxy = Ember.ObjectProxy.create({
  content: object
});

// Access and change existing properties
proxy.get('name')          // 'Foo'
proxy.set('name', 'Bar');
object.get('name')         // 'Bar'

// Create new 'description' property on `object`
proxy.set('description', 'Foo is a whizboo baz');
object.get('description')  // 'Foo is a whizboo baz'

While content is unset, setting a property to be delegated will throw an Error.

1
2
3
4
5
6
7
8
proxy = Ember.ObjectProxy.create({
  content: null,
  flag: null
});
proxy.set('flag', true);
proxy.get('flag');         // true
proxy.get('foo');          // undefined
proxy.set('foo', 'data');  // throws Error

Delegated properties can be bound to and will change when content is updated.

Computed properties on the proxy itself can depend on delegated properties.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ProxyWithComputedProperty = Ember.ObjectProxy.extend({
  fullName: function () {
    var firstName = this.get('firstName'),
        lastName = this.get('lastName');
    if (firstName && lastName) {
      return firstName + ' ' + lastName;
    }
    return firstName || lastName;
  }.property('firstName', 'lastName')
});

proxy = ProxyWithComputedProperty.create();

proxy.get('fullName');  // undefined
proxy.set('content', {
  firstName: 'Tom', lastName: 'Dale'
}); // triggers property change for fullName on proxy

proxy.get('fullName');  // 'Tom Dale'

Show:

Module: ember

Defines the properties that will be concatenated from the superclass (instead of overridden).

By default, when you extend an Ember class a property defined in the subclass overrides a property with the same name that is defined in the superclass. However, there are some cases where it is preferable to build up a property's value by combining the superclass' property value with the subclass' value. An example of this in use within Ember is the classNames property of Ember.View.

Here is some sample code showing the difference between a concatenated property and a normal one:

1
2
3
4
5
6
7
8
9
10
11
12
13
App.BarView = Ember.View.extend({
  someNonConcatenatedProperty: ['bar'],
  classNames: ['bar']
});

App.FooBarView = App.BarView.extend({
  someNonConcatenatedProperty: ['foo'],
  classNames: ['foo'],
});

var fooBarView = App.FooBarView.create();
fooBarView.get('someNonConcatenatedProperty'); // ['foo']
fooBarView.get('classNames'); // ['ember-view', 'bar', 'foo']

This behavior extends to object creation as well. Continuing the above example:

1
2
3
4
5
6
var view = App.FooBarView.create({
  someNonConcatenatedProperty: ['baz'],
  classNames: ['baz']
})
view.get('someNonConcatenatedProperty'); // ['baz']
view.get('classNames'); // ['ember-view', 'bar', 'foo', 'baz']

Adding a single property that is not an array will just add it in the array:

1
2
3
4
var view = App.FooBarView.create({
  classNames: 'baz'
})
view.get('classNames'); // ['ember-view', 'bar', 'foo', 'baz']

Using the concatenatedProperties property, we can tell to Ember that mix the content of the properties.

In Ember.View the classNameBindings and attributeBindings properties are also concatenated, in addition to classNames.

This feature is available for you to use throughout the Ember object model, although typical app developers are likely to use it infrequently.

Module: ember

The object whose properties will be forwarded.

Module: ember

Destroyed object property flag.

if this property is true the observers and bindings were already removed by the effect of calling the destroy() method.

Module: ember

Destruction scheduled flag. The destroy() method has been called.

The object stays intact until the end of the run loop at which point the isDestroyed flag is set.