aurelia / binding

A modern databinding library for JavaScript and HTML.
MIT License
111 stars 96 forks source link

enhance the aurelia abstraction for subscribing to/observing properties #22

Closed davismj closed 9 years ago

davismj commented 9 years ago

We need to wrap the Aurelia observation in a more user-friendly API, for example, au.observe(obj, 'property', callback);

mdread commented 9 years ago

it could be nice to also have a convention for ObserverLocator... maybe using the same convention as per properties (.withProperty) in Behaviors? For example:

export class AClass {
    static metadata(){ return Observer.withProperty("name", "nameChanged"); }

    constructor(){
        this.name = "Daniel";
    }

    nameChanged(value) { ... }
}

here metadata would be used to choose the fields to observe... otherwise it could be done automatically inspecting method and attribute names based on the convention attrNameChanged (if there is a property name and a method nameChanged, then observe on name)

EisenbergEffect commented 9 years ago

You should try it out:

export class AClass {
    static metadata(){ return Metadata.withProperty("name"); }

    constructor(){
        this.name = "Daniel";
    }

    nameChanged(value) { ... }
}

I believe that this should work for view models composed by the router or the compose binding. Dynamic UI composition basically uses the same infrastructure as custom elements.

mdread commented 9 years ago

nice! i didn't know withProperty could be used outside of a custom behavior... just made a test with a VM managed by a router and it works perfectly. The more i use this framework the more i like it :D

So actually this is already implemented for most use cases, the only exception is in classes that has no UI representation (like a service that is only injected in VM) because in that case there is no component who can inspect the metadata property and set-up the observer... and probably would not make sense for those anyway

EisenbergEffect commented 9 years ago

So, for that case, I think we'll have an explicit API as @davismj requests in the issue proper. The secret is that underneath, your basic view-models are essentially the same as a custom element. Actually, you can use them in their own view as a custom element, without needing to import them. You wouldn't do that normally as that would cause an infinite recursion. But, if you were to use an if behavior on it, so that you could toggle it, it would work ;)

EisenbergEffect commented 9 years ago

The next release contains the new bindingSystem object which can be used to subscribe/unsubscribe from properties and collections, among other helpers.