Thanks. It makes much more sense now (as usual with things that work :)).
How about "value"? Would it work the same?
e.g.
myApp.value('myValue',{
myStatus: "ok"
});
or only with a service (
*myApp.service('myService',function(){*
*var myStatusObj = {myStatus: "ok"}; *
*return myStatusObj;*
*});*)

Thanks again

(I'm sorry for the newbie questions, but I'm still trying to get the
differences between factory/value/service/provider/constant - that's my
mission on my 3rd week in Angular...)


On Wed, Feb 12, 2014 at 3:55 PM, Luke Kende <[email protected]> wrote:

> I wrote my example terribly (the service name should obviously be
> consistent).... but yes, the problem is due to primitive reference being
> passed by value.  A rule to follow is always pass an object as javascript
> will maintain reference to the object which is only created once in your
> service (when initializing the app) and exists for the duration of the
> page.  So change your example to:
>
> function EmailService(){
> var myObject = {
>   myStatus: "ok"
> }
>
> return myObject;
> }
>
> function InboxCtrl($scope, EmailService){
>
>   //this will get lost if changing myStatus on scope because copies the
> primitive value
>   $scope.myStatus = EmailService. myStatus;
>
>   //this will not get lost as $scope.email now points to the same object
> as defined in the service
>   $scope.email = EmailService;
>   $scope.email.status = "sweet";  //any change to the object locally
> reflects back to the service because they are the same object, even though
> the property itself is a primitive.  This will be true no matter the view
> changes
> }
>
> Somewhere is written in an angular doc the "dot" rule.  This kind of thing
> trips a lot of Javascript developers up.  By the way, no, the service
> doesn't handle the view at all, it is just injected into the controller
> that is loaded with the view.  It will make sense more as you use it and
> explore it.
>
>
>
>
> On Wed, Feb 12, 2014 at 12:53 AM, Yonatan Kra <[email protected]>wrote:
>
>> Hi,
>> Thanks. That's roughly what I did. I have 2 questions.
>> The simple one: Are you handling the views from the controller itself (by
>> changing the view in the service)?
>>
>>  The "more complex" one:
>>
>> Let's say I have this route defintions:
>>
>>    1. $routeProvider.when('/inbox', {
>>    2. templateUrl: 'inbox.html',
>>    3. controller: InboxCtrl
>>    4. }
>>    5. });
>>    6. $routeProvider.when('/otherPage', {
>>    7. templateUrl: 'otherPage.html',
>>    8. controller: OtherPageCtrl
>>    9. }
>>    10. });
>>
>>
>> In InboxCtrl I call function (*InboxCtrl($scope, MyService)*) and do all
>> kind of manipulations. Let's assume a very simple service here like:
>> function EmailService(){
>> var myStatus = "OK";
>> return {myStatus: myStatus};
>> }
>> function InboxCtrl($scope, MyService){
>> $scope.myStaus = MyService.myStatus;
>> }
>> And it is bound to an input in the view, so user can change myStatus.
>>
>> Now a person clicks on a link that leads him to "otherPage" (with *function
>> OtherPageCtrl($scope, MyService)*).
>>
>> When I call MyService.MyStatus in the "otherPage" controller, I get "OK"
>> no matter what was its value in the "Inbox" page.
>>
>> Is that a glitch in my code? Or is that how it's supposed to be?
>>
>> Thanks
>>
>> On Wed, Feb 12, 2014 at 8:53 AM, Luke Kende <[email protected]> wrote:
>>
>>> Yes.  Use a service.  If it's not working for you then you are coding it
>>> wrong.  My guess is not understanding object inheritance and losing a
>>> reference to primitive values
>>>
>>> My examples are not full blown, but hopefully the details will help you
>>> see what you need:
>>>
>>> function EmailService(){
>>>   var emailObject = {
>>>     emails: [],
>>>     currentView: 'inbox',
>>>     folders: []
>>>   }
>>>
>>>   return {
>>>      emails: emailObject.emails,
>>>      setCurrentView: function(view){
>>>        emailObject.currentView = view;
>>>     },
>>>     folders: emailObject.folders
>>>   }
>>>
>>> }
>>>
>>> function InboxCtrl($scope, MyService){
>>>    $scope.emails = MyService.emails;
>>>
>>>    //now whatever you do on the scope will reflect in the service emails
>>> and will remain there when reloaded
>>>    $scope.emails.push({'from': 'bob', message: 'Hi Larry!'});
>>>
>>>    $scope.folders = MyService.folders;
>>>
>>>   $scope.userClickedFolder(folder){
>>>     MyService.setCurrentView(folder)
>>>   }
>>> }
>>>
>>> function OtherCtrl(){
>>>
>>> }
>>>
>>> On Monday, February 10, 2014 8:40:31 AM UTC-7, Yonatan Kra wrote:
>>>>
>>>> I have a SPA (single page app). I am trying to keep data of one route,
>>>> when moving to another, so if a person returns to the route, he'll see it
>>>> in exactly the same state he left it.
>>>>
>>>> In example, I have an inbox page (e.g. #/inbox).
>>>> On this page, a person can see his inbox, and gets new messages to the
>>>> inbox when he stays on this page.  Unread emails are in bold, read emails
>>>> are normal and they are sorted and filtered in a certain manner the user
>>>> has chosen.
>>>> The app gets one "push" of emails from the server, and then updates
>>>> when it runs.
>>>> It works fine.
>>>>
>>>> The problem arises when this person "navigates" away from the inbox
>>>> "page".
>>>> The navigation is from #/inbox to #/other-page - each has its own
>>>> controller and view.
>>>>
>>>> After the person navigates away, and then comes back to the page, the
>>>> page resets - e.g. the inbox starts from scratch, there are no unread
>>>> emails in bold, filters are reset etc.
>>>> I followed instructions given me here, to keep the data in a service,
>>>> but when I get back to #/inbox, the service resets and I lost the data.
>>>>
>>>> How do I keep such data, so the person would see the same inbox page
>>>> after navigating the rest of the SPA?
>>>> Or is there a smarter way than just rebuilding the page with saved data?
>>>>
>>>> Thanks
>>>>
>>>>
>>>>
>>>>  --
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "AngularJS" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/angular/jL-IAlCZEaU/unsubscribe.
>>> To unsubscribe from this group and all its topics, 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 a topic in the
>> Google Groups "AngularJS" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/angular/jL-IAlCZEaU/unsubscribe.
>> To unsubscribe from this group and all its topics, 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 a topic in the
> Google Groups "AngularJS" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/angular/jL-IAlCZEaU/unsubscribe.
> To unsubscribe from this group and all its topics, 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.

Reply via email to