Yes, just do $scope.$eval($attrs.xxColorize).
On Tuesday, January 7, 2014 6:39:02 AM UTC-7, Kumar Harsh Srivastava wrote:
>
> Hi Josh, on a related topic, I had a doubt:
>
> There are instances when passing an object to the directive by manually
> writing it as the value of an attribute may be useful, like passing initial
> options to the directive, like this (a bad example, but just bear with me)
>
>
>
>
>
> * <div data-ng-repeat="test in data.tests"> <span
> data-xx-colorize data-xx-colors="{hue: {{5*$index}}, sat: {{50+10/$index}},
> lum: 50}"> {{test}} </span> </div>*
>
> Now, if I do bind it to my scope within the directive as so:
>
>
>
>
>
>
>
>
>
>
> * directive('xxColorize', function() { ... scope:
> { color: "&xxColors" } controller =
> function($scope, ...) { myColor = $scope.color();
> ... } });*
>
> But this style of usage has one fault... It will necessarily create an
> isolated scope.
> What if I do NOT want any scope at all...
>
> Is there a way to get the object to my directive without creating an
> isolates scope?
> I know *JSON.parse($attrs.xxColorize)* does the job, but it would fail if
> the oject is not correctly formed (string keys, etc).
> This problem does not happen in the method of binding with '*&xxColorize*',
> but sadly that is what I'm trying to avoid.
>
> Is there another way to do it?
>
> On Saturday, 5 January 2013 23:38:29 UTC+5:30, Josh David Miller wrote:
>>
>> Hi Dave!
>>
>> If you don't need two-way binding and you know in advance which
>> attributes you need and there aren't too many, then I think you're right:
>> string-based scoping (`@`) is probably the right way to go. It's just
>> simpler.
>>
>> Josh
>>
>>
>> On Sat, Jan 5, 2013 at 8:56 AM, Venkatraman Dhamodaran
>> <[email protected]>wrote:
>>
>>> Hi Dave,
>>>
>>> As Joshua suggested, & can be used to solve your problem [No two way
>>> binding, but want to pass complex object].
>>>
>>> Updated the jsfiddle to use &
>>>
>>> http://jsfiddle.net/ramandv/nSseE/6/
>>>
>>> -Venkat
>>>
>>>
>>> On Sat, Jan 5, 2013 at 9:29 PM, Dave Merrill <[email protected]> wrote:
>>>
>>>> @Josh and Venkat, thanks for the ideas.
>>>>
>>>> I don't need two-way binding, so breaking bidirectionality isn't a
>>>> problem.. I was only using = to allow a complex object to be passed as an
>>>> attribute, without doing $eval on a passed string version of it.
>>>>
>>>> I'm not sure if you could set the properties of an empty object passed
>>>> through =; kind of doubt it, since the object is bound. But since the
>>>> point
>>>> is not to require callers to pass seldom-used configs at all, I don't want
>>>> to require them to pass the empty config object either.
>>>>
>>>> I've decided that in my immediate case, passing an object is more
>>>> trouble than it's worth. I'm passing individual attributes instead, so
>>>> missing ones can easily be defaulted/
>>>>
>>>> If you're interested, here's a fiddle testing different strategies for
>>>> doing that defaulting, only one of which, setting missing attrs, only,
>>>> works correctly:
>>>> http://jsfiddle.net/davemerrill/s5ZXG/4/
>>>>
>>>> Dave
>>>>
>>>> On Friday, January 4, 2013 8:00:13 PM UTC-5, Joshua Miller wrote:
>>>>
>>>>> Hello!
>>>>>
>>>>> Venkatraman is right, but the caveat I supplied still applies: this
>>>>> completely breaks bi-directional data binding, which is the entire
>>>>> purpose
>>>>> of '='. Under that example, neither objects that were passed nor those
>>>>> that
>>>>> weren't can propagate changes to the scope where they were defined (at
>>>>> least not without hacking a couple of $watches). As I said, if data
>>>>> binding
>>>>> is not required, then '@' or '&' are the way to go, philosophically.
>>>>>
>>>>> Josh
>>>>>
>>>>>
>>>>> On Fri, Jan 4, 2013 at 4:45 PM, Venkatraman Dhamodaran <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Dave,
>>>>>>
>>>>>> If the usage of "=" is mandatory, new scope member can be created by
>>>>>> merging the your default values and passed obj. And use the new scope
>>>>>> member in the template.
>>>>>>
>>>>>> Check the updated fiddle
>>>>>>
>>>>>> http://jsfiddle.net/ramandv/nSseE/5/
>>>>>>
>>>>>> -Venkat
>>>>>>
>>>>>>
>>>>>> On Sat, Jan 5, 2013 at 5:00 AM, Joshua Miller
>>>>>> <[email protected]>wrote:
>>>>>>
>>>>>>> Hi Dave!
>>>>>>>
>>>>>>> I guess you _wouldn't_ go about setting default values. It's a
>>>>>>> two-way binding with '=' to the parent scope, so you shouldn't be able
>>>>>>> to
>>>>>>> create it spontaneously in a child scope (i.e. the directive). If you
>>>>>>> need
>>>>>>> it to be optional, I suppose the best approach would be to pass in an
>>>>>>> empty
>>>>>>> object through '=' so you can manipulate its missing properties:
>>>>>>> http://jsfiddle.net/joshdmiller/nSseE/4/. Any other solution would
>>>>>>> make the property irretrievable in the parent scope, defeating the
>>>>>>> purpose
>>>>>>> of the two-way binding. However, if the two-way binding isn't needed,
>>>>>>> you
>>>>>>> should use '@' and pass in an expression (like `prop="{{val}}"`) which
>>>>>>> you
>>>>>>> could manipulate when there is no default as it's just a string.
>>>>>>>
>>>>>>> Josh
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Jan 4, 2013 at 8:51 AM, Dave Merrill <[email protected]>wrote:
>>>>>>>
>>>>>>>> So @ doesn't evaluate, but = and & do, right? I didn't quite get
>>>>>>>> that the first times I read the docs about this.
>>>>>>>>
>>>>>>>> One consequence of = and & bind appears to be that those
>>>>>>>> attributes aren't settable within your linking function., which makes
>>>>>>>> sense, since it's bound ot the value whose name is passed in the
>>>>>>>> attribute.
>>>>>>>> Given that, how do you set default values for those attributes, to be
>>>>>>>> used
>>>>>>>> if they're not passed.
>>>>>>>>
>>>>>>>> In the example here:
>>>>>>>> http://jsfiddle.net/davemerrill/nSseE/2/
>>>>>>>> ...the title attribute can be defaulted if it's not passed, but
>>>>>>>> setting attrs.prop in the linking function appears to change it if you
>>>>>>>> log
>>>>>>>> it right there, but it has no effect when the directive renders.
>>>>>>>>
>>>>>>>> How would you go about setting default values for complex
>>>>>>>> attributes passed with = then?
>>>>>>>>
>>>>>>>> Dave
>>>>>>>>
>>>>>>>>
>>>>>>>> On Thursday, January 3, 2013 2:10:24 PM UTC-5, Joshua Miller wrote:
>>>>>>>>
>>>>>>>>> The docs could probably be a little bit clearer here, but the
>>>>>>>>> basic idea is that '@' evaluates the attribute and keeps it in sync
>>>>>>>>> on the
>>>>>>>>> directive's scope, but it doesn't take a variable directly, so you're
>>>>>>>>> just
>>>>>>>>> passing in the object string; '&' evaluates an expression to a
>>>>>>>>> function
>>>>>>>>> accessible on the directive's scope, but the expression is evaluated
>>>>>>>>> relative to the _directive's_ scope, so it doesn't have access to the
>>>>>>>>> parent's scope property; finally, '=' just passes a property from the
>>>>>>>>> parent scope into the directive and keeps it in sync, which is what
>>>>>>>>> you
>>>>>>>>> want in this case.
>>>>>>>>>
>>>>>>>>> For what it's worth, you could use '&' for the object literal:
>>>>>>>>> http://plnkr.co/edit/uIyPrk?p=preview. The key is that '&'
>>>>>>>>> creates a function from the expression, which must then be called to
>>>>>>>>> retrieve the evaluated object.
>>>>>>>>>
>>>>>>>>> Josh
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Thu, Jan 3, 2013 at 10:39 AM, Dave Merrill wrote:
>>>>>>>>>
>>>>>>>>>> Hmmm, using '='' as the scope character, as you did, gets it to
>>>>>>>>>> work. Even passing an object literal works that way, sort of. Take a
>>>>>>>>>> look
>>>>>>>>>> at this fork:
>>>>>>>>>> http://jsfiddle.net/davemerrill/FHVD9/3/
>>>>>>>>>>
>>>>>>>>>> It has three instance of the directive on the page, and though
>>>>>>>>>> they all display correctly, if you enable the console you'll see a
>>>>>>>>>> "10
>>>>>>>>>> $digest() iterations reached" error. Without the object literal
>>>>>>>>>> instance it works fine. Using '@' instead of '=' doesn't overflow,
>>>>>>>>>> but also
>>>>>>>>>> doesn't work, for any of those instances.
>>>>>>>>>>
>>>>>>>>>> There's no need in my case to pass an object literal, it was just
>>>>>>>>>> handy, so the overflow problem with doing that isn't a big deal.
>>>>>>>>>> Creating a
>>>>>>>>>> scope var and passing it in does seem better than using $eval.
>>>>>>>>>>
>>>>>>>>>> Can you explain why '=' makes this work? The docs (which I am
>>>>>>>>>> reading btw!) say it makes the binding bi-directional, but I don't
>>>>>>>>>> get the
>>>>>>>>>> connection, or how you knew to do that.
>>>>>>>>>>
>>>>>>>>>> Dave
>>>>>>>>>>
>>>>>>>>>> On Thursday, January 3, 2013 2:43:48 AM UTC-5, Joshua Miller
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi Dave!
>>>>>>>>>>>
>>>>>>>>>>> Do you mean just passing an object variable off the scope to a
>>>>>>>>>>> directive through an attribute? Like this: http://jsfiddle.net/
>>>>>>>>>>> joshdmiller/FHVD9/
>>>>>>>>>>>
>>>>>>>>>>> Josh
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Wed, Jan 2, 2013 at 10:35 PM, Dave Merrill wrote:
>>>>>>>>>>>
>>>>>>>>>>>> It's true that scope.$eval does work, converting the passed
>>>>>>>>>>>> string to an object.
>>>>>>>>>>>>
>>>>>>>>>>>> We don't have to do that with simple types. Is that the state
>>>>>>>>>>>> of the art, or is there some other way to pass an object into a
>>>>>>>>>>>> directive
>>>>>>>>>>>> as an attribute?
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> Dave
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Wednesday, January 2, 2013 7:28:24 PM UTC-5, Tucker W wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> Could you use scope.$eval?
>>>>>>>>>>>>>
>>>>>>>>>>>>> http://plnkr.co/edit/6xVZSrpfn3kbfHH7f91S
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Wednesday, January 2, 2013 5:54:58 PM UTC-5, Dave Merrill
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I'd like to pass a static or $scope-d object to a tag
>>>>>>>>>>>>>> directive as an attribute. Is that possible?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I've tried these, among other variations:
>>>>>>>>>>>>>> <my-directive map="{a: 1, b: 2}"...
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> <my-directive map="{{{a: 1, b: 2}}}"...
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> $scope.map = {a: 1, b: 2};
>>>>>>>>>>>>>> then
>>>>>>>>>>>>>> <my-directive map="map"...
>>>>>>>>>>>>>> or
>>>>>>>>>>>>>> <my-directive map="{{map}}"...
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I've tried declaring the attribute in the directive like this:
>>>>>>>>>>>>>> scope: {map: '@'}
>>>>>>>>>>>>>> and
>>>>>>>>>>>>>> scope: {map: '&'}
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> None of those appear to work. I'm sure I'm missing something
>>>>>>>>>>>>>> obvious. Any thoughts?
>>>>>>>>>>>>>> Dave
>>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>> Google Groups "AngularJS" group.
>>>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>>>> To unsubscribe from this group, send email to angular+u...@
>>>>>>>>>> googlegroups.com.
>>>>>>>>>>
>>>>>>>>>> Visit this group at http://groups.google.com/group
>>>>>>>>>> /angular?hl=en-US.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "AngularJS" group.
>>>>>>>> To post to this group, send email to [email protected].
>>>>>>>> To unsubscribe from this group, send email to angular+u...@
>>>>>>>> googlegroups.com.
>>>>>>>> Visit this group at http://groups.google.com/group/angular?hl=en-US
>>>>>>>> .
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "AngularJS" group.
>>>>>>> To post to this group, send email to [email protected].
>>>>>>> To unsubscribe from this group, send email to angular+u...@
>>>>>>> googlegroups.com.
>>>>>>> Visit this group at http://groups.google.com/group/angular?hl=en-US.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "AngularJS" group.
>>>>>> To post to this group, send email to [email protected].
>>>>>> To unsubscribe from this group, send email to angular+u...@
>>>>>> googlegroups.com.
>>>>>> Visit this group at http://groups.google.com/group/angular?hl=en-US.
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "AngularJS" group.
>>>> To post to this group, send email to [email protected].
>>>> To unsubscribe from this group, send email to
>>>> [email protected].
>>>> Visit this group at http://groups.google.com/group/angular?hl=en-US.
>>>>
>>>>
>>>>
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "AngularJS" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected].
>>> Visit this group at http://groups.google.com/group/angular?hl=en-US.
>>>
>>>
>>>
>>
>>
--
You received this message because you are subscribed to the Google Groups
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/groups/opt_out.