1

我正在尝试构建一个简单的用户名登录系统。这只是为了记录我可以在我的各种控制器中使用的用户名。

但是,由于某种原因,我无法获得$scope.userName价值abcController

这个问题的本质是跨控制器共享数据。

控制器.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
});

资源.js

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

一旦用户单击登录按钮,就会出现一个 twitter-bootstrap 模式(弹出窗口)并要求用户输入他们的用户名。

索引.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>

如果有更好的方法来做我上面想做的事情,请随时提出建议。

4

2 回答 2

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;
});

我认为可能会发生什么(而且我看不到您的所有代码),但我认为username当您在abcController. 通过首先在对象模式中定义 abcController 可以附加到的共享引用,它将在稍后调用 updateSession() 时反映更改。

这是一个使用您的服务理念的工作示例。

于 2013-07-02T15:14:06.117 回答
0

emit我找到了使用and的替代解决方案broadcast此jsfiddle中的完整代码示例

应用程序.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);
    });
});

控制器.js

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
});
于 2013-07-02T19:39:56.723 回答