0

这是我的标记

    <div id="username" ng-controller="quickUserAdd">
    <h1>User</h1>
    <input placeholder="your full name" ng-model="fullname">
    <div ng-show="fullname">
        <div>
            <span class="big">Username</span>
            <span class="small">{{username()}}</span>
        </div>
        <div class="password-{{passwordStatus()}}">
            <input type="password" ng-model="password" placeholder="Password"/>
            <span class="small">{{passwordStatus()}}</span>
        </div>
    </div>
</div>

我的控制器:

    var passwordStrengths = ["weak", "medium", "ok", "great"];
    function quickUserAdd($scope)
    {
        $scope.password = "";
        $scope.fullname = "";
                   ....
    }

如何将 $scope.fullname、$scope.username 和 $scope.password 绑定到installation.user[0](其中安装是一个全局对象),以便在全名、用户名或密码发生任何更改时,它们都会被更新在installation.user[0] (也是一个对象)?

4

2 回答 2

3

我相信您很清楚全局变量的问题,所以我在这里假设您没有其他选择,并且在您的用例中您需要访问全局定义的 JavaScript 对象。

在您的情况下,最简单的方法可能是在您的控制器中公开installation.user[0]范围,如下所示:

function quickUserAdd($scope) {
   $scope.user = installation.user[0];
   ....
}

然后user像这样绑定到对象的属性:

<input placeholder="your full name" ng-model="user.fullname">
<input type="password" ng-model="user.password" placeholder="Password">

这样,输入框中的任何更改都应立即传播到全局变量。

请注意,如果您想在 AngularJS 世界之外更改全局变量并且仍然更新 UI,则必须将此更改包装到Scope.$apply()方法中。

如果我可以再建议一件事:通常人们倾向于将 AngularJS 控制器命名为以大写开头并添加 Ctrl 后缀,这样您的控制器就可以命名为QuickUserAddCtrl;

于 2012-12-16T13:15:10.323 回答
0

我真正需要的是共享服务。

这允许我在控制器之间共享数据结构,在这种情况下,在 QuickUserAdd(快速添加一个用户)和 UsersEditor(修改整个用户列表。在应用程序的不同页面中)之间共享用户。

此外,我可以使用 pkozlowski.opensource 的解决方案(在初始化时引用外部对象)将我的所有服务附加到“安装”中的对象。并且永远不需要 Scope.$apply() ,因为安装对象只需要能够一次读取从 UI 收集的所有数据。

于 2012-12-16T14:40:07.370 回答