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 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