在我的Bootstrap Modal关闭后,为什么Angular的`$ location.url`不工作?

时间:2017-04-02 02:32:18

标签: angularjs twitter-bootstrap-3 mean-stack

问题:

任何人都知道为什么在我的cb.register函数中,我的模态窗口关闭,但$location.url('/dashboard')无法正常运行?

我没有收到任何控制台错误,并且页面没有重定向。但是,在模态窗口关闭后,console.log('TRANSITION DONE')仍会在下面的代码中打印出来,所以我知道事件正在被识别:

代码:

app.controller('userController', ['$scope', 'userFactory', '$location', function($scope, userFactory, $location) {
    var cb = {
        register: function(createdUser) {
            // Closes Modal window:
            $('#myModal').modal('hide');
            // Runs after close with completed transition effects:
            $('#myModal').on('hidden.bs.modal', function (e) {
                console.log('TRANSITION DONE');
                $location.url('/dashboard');
            })
        },
    };

}]);

的问题:

  • 为什么$location服务嵌套在.on()函数内时行为不正常?
  • 我应该使用angular-ui吗? (在研究这个问题的解决方案之前我并不熟悉,而是首先使用bootstrap3并包含JS文件等来构建所有视图来启动我的项目。)

我试过的:

  • 我已经尝试将$location参数传递给.on()的回调函数以及e,但这没有做出真正的改变,而且该函数仍然应该有访问更大范围内的$location

  • 控制台日志记录$location$location.url正常运行,因此我知道这些方法可以在范围内访问。

  • $location功能移到on()功能之外会加载仪表板页面,但淡出模式关闭不会完成。浅灰色透明BG覆盖在我的仪表板页面上,这就是我选择根据文档使用hidden.bs.modal事件的原因:http://getbootstrap.com/javascript/#modals

    // Closes window:
    $('#myModal').modal('hide');
    // Redirects to page but fade-out on Modal not completed:
    $location.url('/dashboard');
    

所需行为/伪代码:

  • 模态窗口关闭(回调运行时)
  • Modal淡出后:
    • $location.url('/dashboard')运行,加载信息中心页面

感谢任何有帮助的角色/自助忍者!

1 个答案:

答案 0 :(得分:2)

为什么嵌套在我的.on()函数中时,$ location服务的行为不正常?

您在应用程序中直接使用Bootstrap模式 - 这没关系。 但是,这需要你用jQuery操作模态。不建议在AngularJS应用程序中使用jQuery,因为AngularJS有自己的DOM操作方法,因此不应该通过jQuery手动操作DOM。

要回答你的问题,因为你正在使用jQuery来直接操作DOM,所以很可能AngularJS的摘要周期没有在模态结束时获得。你可以告诉AngularJS通过$scope.$apply()激活一个摘要周期来解决这个问题。但是,根据最佳AngularJS原则,这很容易弄脏您的代码并且没有意义。

我应该使用angular-ui吗? (在研究这个问题的解决方案之前我并不熟悉,而是首先使用bootstrap3并包含JS文件等来构建所有视图来启动我的项目。)

是。我高度建议使用angular-ui。根据文件:

  

此存储库包含一组基于Bootstrap标记和CSS的本机AngularJS指令。因此,不需要依赖jQuery或Bootstrap的JavaScript。

正如您所看到的,所有Bootstrap功能都已包含在AngularJS指令中,可以轻松地将其删除到您的应用程序中,而无需担心jQuery。