...or $scope.$watch($attrs. xxColorize, function(xxColorize) {...}, true)
if the value is dynamic, like when it uses other values which may change. I
am no sure if the last argument "true" is necessary.Regards, Witold Szczerba --- Sent from my mobile phone. On Jan 7, 2014 3:59 PM, "Daniel Tabuenca" <[email protected]> wrote: > 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. > -- 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.
