【问题标题】:Angular update scope from event来自事件的角度更新范围
【发布时间】:2013-10-28 02:32:09
【问题描述】:

我有一个管理应用程序身份验证的角度服务。还有一个控制器。

当用户登录和注销时,服务会在$rootScope 上触发偶数。

我想更新 UI 中的 DOM 元素,因此它会根据用户状态显示“登录”或“注销”。

请注意,我的 Angular 知识,尤其是在事件方面的知识不是很好,所以请随时给我关于最佳实践的建议。

这是我当前的代码。

app.service('AuthenticationService', function ($rootScope) {

var _loggedIn = "false";

this.login = function (email, password) {

    if (!email || !password) return 1;
    else {
        _loggedIn = "true";
        // broadcast on root scope, so anyone can listen
        $rootScope.$broadcast("loginChanged", 1);
        return 0;
    }
};

this.logout = function (email, password) {
    _loggedIn = "false";
    // broadcast on root scope, so anyone can listen        
    $rootScope.$broadcast("loginChanged", 0);

} 
/*other functions ommited*/
});

在我的控制器中

var addListener = function () {
    listener = $scope.$on("loginChanged", function (e, loggedIn) {
        $scope.loginButton.text = loggedIn ? "Log Out" : "Log In";
        $scope.loginButton.link =  loggedIn ? "#/logout" : "#/login";

        console.log("loginChanged: " + loggedIn);
    }); // $on returns a registration function for the listener
};

问题是 console.log(...) 工作正常,尽管 $scope 更新未反映在 UI 中。我尝试将其包装在 $scope.$apply 中,这导致错误提示应用已在进行中。

如何从事件更新 UI?有没有更好/更标准的方法来达到同样的效果?

提前致谢

【问题讨论】:

  • 提供复制问题的演示。听起来可能有一些嵌套可能导致范围继承问题。没有标记很难提供帮助。如果日志正常工作...问题在别处
  • 显示您如何在 HTML 中集成 loginButton 变量
  • 登录按钮是 HTML 格式的 <a href="{{loginButton.link}}">{{loginButton.text}}</a>

标签: javascript angularjs angularjs-scope


【解决方案1】:

您的代码运行良好。这是一个笨蛋:http://plnkr.co/edit/BUOAUgOe1y3e6S2Dq6dW?p=preview

但我不会使用 $brodcast 来通知 ui 更改。这就像用全局变量污染你的全局命名空间。我建议传入一个服务并监听该服务的变化。我创建了一个 plunker 来向您展示我的意思: http://plnkr.co/edit/MCWThc1ZtaAxmZSTirT6?p=preview

【讨论】:

  • _loggedIn$broadcast 中使用的似乎是数字的数据参数loggedIn 混淆
  • 你是对的。通过重构源代码以不使用 $broadcast 并回想错误是什么,它使自己感到困惑。将更新我的答案。泰
  • 使用 $broadcast 的开销比 $watch 少
  • 开销更少是什么意思?
  • 这取决于你想做什么。检查这篇帖子eburley.github.io/2013/01/31/…charlietfl 是正确的,$watch 比 $broadcast 贵。但只要它是一个简单的原语你看,我不会太担心性能。 stackoverflow.com/questions/19616520/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多