2013-07-02 5 views
1

간단한 사용자 이름 로그인 시스템을 구축하려고합니다. 이것은 내 다양한 ​​컨트롤러에서 사용할 수있는 사용자 이름을 기록하기위한 것입니다.AngularJS에서 컨트롤러를 통한 데이터 공유가 작동하지 않는 이유

는하지만, 어떤 이유로, 나는 abcController

이 문제의 본질은 컨트롤러를 통해 데이터를 공유에 $scope.userName 값을 얻을 수 없습니다입니다.

controller.js

app.controller('userNameController',function ($scope, $log, Config, Session) 
{ 
    Session.updateSession($scope.userName); 
}); 

app.controller('abcController',function ($scope, $log, Config, Session) 
{ 
    $scope.userName=Session.data.username; 
    //some other code 
}); 

resource.js 즉시 사용자가 로그인 버튼 트위터 - 부트 스트랩 모달 (팝업)를 클릭로

app.factory('Session', function() { 
    var Session = { 
     data: {}, 
     updateSession: function(userName) { 
      Session.data = { "username": userName } 
     } 
    }; 
    return Session; 
}); 

가 나타나고 사용자에게 묻습니다 사용자 이름을 입력하십시오.

index.html을

<div ng-controller="userNameController"> 
<button class="btn" id="enterUsernameBtn" href="#userNameModal" role="button" class="btn" data-toggle="modal" title="Enter Username">Login</button> 
</div> 

    <!-- UserName Modal --> 
    <div id="userNameModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="userNameModalLabel" aria-hidden="true"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
      <h3 id="userNameModalLabel">Enter your username</h3> 
     </div> 
     <div class="modal-body"> 
      <p><b>UserId</b></p> 
      <div class="input-append"> 
       <input class="pull-left" id="userIdTextBox" type="text" style="left:8px; width:160px" ng-controller="userNameController" ng-model="userName"> 
      </div> 
     </div> 
     <div class="modal-footer"> 
      <button class="btn" data-dismiss="modal" aria-hidden="true">Submit</button> 
     </div> 
    </div> 

내가 위에서 할 노력하고 무엇을 할 수있는 더 좋은 방법이 있다면, 제안 주시기 바랍니다.

+0

가이되지 않습니다 jsfiddle

에서 전체 코드 예제는 app.js

app.run(function($rootScope) { /* Receive emitted message and broadcast it. Event names must be distinct or browser will blow up! */ $rootScope.$on('handleEmit', function(event, args) { $rootScope.$broadcast('handleBroadcast', args); }); }); 

controller.js 당신의 userNameController 세트 userName 속성? 아마도 $ scope.userName === abcController에서 정의되지 않았습니다. Session.data.username을 필요할 때 직접 사용하면 어떻게됩니까? Session 리소스를 abcController $ scope에 연결해야 할 수도 있습니다. – cirrus

+0

이 기사가 흥미로울 수 있습니다. http://blog.jdriven.com/2013/03/how-to-create-singleton-angularjs-services-in-4-different-ways/ – vittore

+0

@cirrus, 당신 말이 맞습니다. 그것은 일어날 수있는 일입니다. 나는'app.run (function (Session) {});을 썼다. // bootstrap session; 다른 .js 파일보다 먼저 참조되는 app.js에 있습니다. 그건 도움이되지 않았어. abcController에 이미 Session 리소스를 첨부하지 않았습니까? 도와주세요, 각도 요. 여기 멍청한 놈. – Watt

답변

3

리소스를 이와 같이 정의하면 도움이됩니까?

app.factory('Session', function() { 
    var Session = { 
     data: { username: undefined }, // ensure object ref to attach to 
     updateSession: function(userName) { 
      Session.data.username = userName; // do NOT recreate the object above 
     } 
    }; 
    return Session; 
}); 

나는 일이 될 수 있습니다 어떤 생각 (나는 당신의 모든 코드를 볼 수 없습니다)하지만 난 당신이 abcController에 대한 참조를 찍을 때 username가 설정되어 있다고 생각하지 않습니다. abcController가 연결할 수있는 객체 스키마에서 먼저 공유 참조를 정의하면 나중에 updateSession()이 호출 될 때 변경 사항이 반영됩니다.

다음은 서비스 아이디어를 사용하는 example입니다.

+1

어딘가에서'app.run (function (Session) {});을 작성해야합니다. // bootstrap session;'app.js'에서 도움이 될까요? – Watt

+0

btw, 내가 제안한대로 제 리소스를 정의했는데 도움이되지 않았습니다. – Watt

+0

두 컨트롤러에서 console.log()를 사용하면 순서를 볼 수 있고 사용자 이름을 초기 더미 값 (예 : "xxxx")으로 설정할 수 있습니다. 값을 변경할 때 abcController에 값이 반영되어 있음을 확인해야하지만 '.'이 필요하다는 것을 기억하십시오. 참고. 기본 참조를 * 변경 *하면 두 참조 사이의 연결이 끊어집니다. 이전 코드에서는 REASSIGNED 데이터를 완전히 가지고 있으므로 abcController는 정의되지 않은 username 속성은 말할 것도없고 다른 data {} 객체에 바인딩했습니다. – cirrus

0

emitbroadcast을 사용하여 대체 솔루션을 찾았습니다. 당신의 abcController 이미 시간에 실행 때문에

app.controller('userNameController',function ($scope, $log, Config) 
{ 

    $scope.submitUserName= function() 
    { 
     // Session.updateSession($scope.userName); 
     $scope.$emit('handleEmit', {username: $scope.userName}); 
    }; 

}); 

app.controller('abcController',function ($scope, $log, Config) 
{ 
    $scope.$on('handleBroadcast', function(event, args) { 
     $scope.userName = args.username; 
     }); 
    //some other code 
}); 
+0

사실, 다시 생각해 보면, 다이제스트주기가 다른 컨트롤러에서는 실행되지 않기 때문에이 작업이 필요할 것입니다. 따라서 abcController에서 userNameController에서 무언가가 발생했을 때 다이제스트주기를 트리거하지 않으면 userName이 변경된 것을 볼 수 없을 것입니다. * if * 보이면 보일 수도 있습니다. 내 제안은 서비스를 통해 userName을 전달할 것입니다.하지만 abcController에 대한 $ digest를 트리거하는 다른 메커니즘이 필요합니다. – cirrus

관련 문제