2016-02-16 8 views
1

У меня есть эта factory в моих AngularJS:Не удается получить значение объекта в угловых

app.factory('userFactory', function($window) { 
    var auth = { 
     isLogged: false,  
     user: "a", 
     check: function() { 
      if ($window.sessionStorage.token) { 
       this.isLogged = true; 
      } else { 
       this.isLogged = false; 
       delete this.user; 
      } 
     } 
    } 
    return auth; 
}); 

Я ставлю этот статический, для тестирования, внутри AngularJS controller, когда button щелкают это работает.

// replace "a" with the following 
app.controller('LoginCtrl', ['$scope', '$window', '$location', 'userFactory', 
    function ($scope, $window, $location, userFactory) {  
     $scope.login = function(){ 
      var userCredentials = { 
       "username": $scope.username, 
       "password": $scope.password 
      }; 
      if (userCredentials.username == "amir" && userCredentials.password == "blum") { 
       userFactory.isLogged = true; 
       userFactory.user = { 
        "name": "amir", 
        "surname": "blumenfeld" 
       }; 
       $location.path("/customer"); 
      } else { 
       alert("NO"); 
      } 
     } 
    } 
]); 

И тогда я пытаюсь сделать:

function menuCtrl($scope, $location, userFactory, $window) { 
    $scope.user = userFactory.user.surname; 
} 

Так "Блюменфельд" должен оказал здесь

<ul ng-controller="menuCtrl">     
    <li><a href="#home">{{ user }}</a></li>                          
</ul> 

Но я не получаю ничего, только пустое пространство.

Пожалуйста, помогите мне понять, где я ошибся. Как я могу это исправить?

Благодаря

+1

plunker? может ли ваш код? –

+0

Похоже, у вас есть состояние гонки. При изменении '$ scope.user' значение не будет пересчитываться при изменении' userFactory.user' в другом контроллере. –

+0

@ LoïcFaure-Lacroix не может быть состояния гонки. после того, как будут проведены достаточные циклы дайджеста, будет присутствовать значение – eltonkamami

ответ

0

скопировать вставили свой код и он, кажется, работает look here

var myApp = angular.module('myApp', []); 
myApp.factory('userFactory', function($window) { 
    var auth = { 
     isLogged: false,  
     user: "a" 
    } 
    return auth; 
    }); 
function MyCtrl($scope, userFactory) { 
    userFactory.user = {"name":"amir","surname":"blumenfeld","job":"crazy"}; 
    $scope.user = userFactory.user.surname; 
} 
+0

То же самое здесь, userFactory.user устанавливается после $ scope.user. –

+0

Извините, я забыл обновить свою скрипку. @slevin теперь работает – IsraGab

1

Проблема заключается в том, что вы, кажется, настройка $scope.user к userFactory.user.surname, когда он создан. Другими словами, ваш user - a и surname - undefined.

Затем в событии click вы устанавливаете объект userFactory.user. Но поскольку значение $scope.user не определено, он не знает, что это значение зависит от userFactory.user, и значение не изменяется и всегда будет undefined.

Если вы хотите что-то, что работает, вам нужно будет установить объект на вашей фабрике на объект. И в вашем событии клика вам придется обновлять значения без изменения объекта.

var app = angular.module('MyApp', []); 
 
app.factory('userFactory', function($window) { 
 
    var auth = { 
 
     isLogged: false,  
 
     user: { 
 
     name: "a", 
 
     surname: "a", 
 
     job: "a", 
 
     } 
 
    } 
 
    return auth; 
 
    }); 
 

 
app.controller('menuCtrl2', ['$scope', 'userFactory', function($scope, userFactory){ 
 
    $scope.load = function() { 
 
    userFactory.user.name = "amir" 
 
    userFactory.user.surname = "blumenfeld" 
 
    userFactory.user.job = "crazy" 
 
    } 
 
}]); 
 

 
app.controller('menuCtrl', ['$scope', 'userFactory', function($scope, userFactory){ 
 
    $scope.user = userFactory.user; 
 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div class="container" ng-app="MyApp"> 
 
    <div ng-controller="menuCtrl2"> 
 
    <button ng-click="load()">Load</button> 
 
    </div> 
 
    <div class="row" ng-controller="menuCtrl"> 
 
    {{user.surname}} 
 
    </div> 
 
</div>

Вот второй вариант с использованием метода:

var app = angular.module('MyApp', []); 
 
app.factory('userFactory', function($window) { 
 
    var auth = { 
 
     isLogged: false,  
 
     user: { 
 
     name: "a", 
 
     surname: "a", 
 
     job: "a", 
 
     } 
 
    } 
 
    return auth; 
 
    }); 
 

 
app.controller('menuCtrl2', ['$scope', 'userFactory', function($scope, userFactory){ 
 
    $scope.load = function() { 
 
    userFactory.user = {"name":"amir", "surname":"blumenfeld", "job":"crazy"}; 
 
    } 
 
}]); 
 

 
app.controller('menuCtrl', ['$scope', 'userFactory', function($scope, userFactory){ 
 
    $scope.user = function() { 
 
    return userFactory.user.surname 
 
    } 
 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div class="container" ng-app="MyApp"> 
 
    <div ng-controller="menuCtrl2"> 
 
    <button ng-click="load()">Load</button> 
 
    </div> 
 
    <div class="row" ng-controller="menuCtrl"> 
 
    {{user()}} 
 
    </div> 
 
</div>

+0

Спасибо за ответ. Я проверю и дам вам знать. Я добавил больше информации в мой оригинальный пост.Проверьте это, если вам нравится – slevin

+0

, обратите внимание, что шаблон не может использовать просто «пользователь», поскольку это базовое значение, которое невозможно угадать, если оно изменено, если явно не изменено в области. –

+0

По-прежнему не работает. Я еще раз проверю и дам вам знать. – slevin

-2

Попробуйте создать пользовательский объект без "" вокруг имен свойств:

userFactory.user = {name:"amir",surname:"blumenfeld",job:"crazy"}; 
Смежные вопросы