在历史记录的popstate事件中获取AngularJs $scope?

3

我是一个新手AngularJS开发者,以下是我的经历:

var app = angular.module('myapp', []);
app.controller('ProductCtrl', ['$scope', '$sce', function ($scope, $sce) {
    $scope.products = myapp.products;
    $scope.pager = $sce.trustAsHtml(myapp.pager);
    $scope.getProducts = function($event) {
        $event.preventDefault();
        var $link = $($event.target);
        var url = $event.target.href;
        $.getJSON(url, function(response) {
            $scope.$apply(function() {
                $scope.products = response.products;
                $scope.pager = $sce.trustAsHtml(response.pager);
            });
            history.pushState(response, "Index", url);
        });
    };
}]);
$(window).bind("popstate", function (e) {
    console.log(e.originalEvent.state);// I need scope here
});

您可以看到,点击将调用getProducts方法,该方法将更新$scope.products和$scope.pager。我还在执行history.pushState。现在,我想要的是,每当用户单击返回按钮时,我需要再次更新$scope.products$scope.pager。这是否可能使用AngularJS?


你不应该注入HTML来创建分页器,而应该使用Angular来实现。 - Dalorzo
你不应该调用 $event.preventDefault(),因为它是 Angular 的方法。 - Dalorzo
如果方法属于作用域,您不应在 Angular 方法内调用 $scope.$apply,因为 Angular 会自动处理它。 - Dalorzo
2
你正在混用jQuery和Angular...不要这样做!除非你试图将Angular集成到现有的遗留代码中,否则这是不可接受的。请使用适当的关注点分离...控制器仅用于编写$scope。为后端调用创建服务并为DOM操作创建指令。 - mortsahl
在 YouTube 上有来自 egghead.io 的优秀教程。 - mortsahl
显示剩余4条评论
2个回答

4
你混淆了 JqueryAngularjs。尽管许多有用的库需要使用 Jquery,但在这里,你正在使用 Jquery 重新创建 Angular 的许多功能。
首先,你应该查看 Angular 的 $routeProvider$locationProvider.html5Mode(true);,它们可以轻松启用应用程序导航和历史记录。这是一篇 很好的博客文章,由 Scotch.io 开始介绍这个主题。
接下来您正在使用Jquery的Ajax,而应该使用Angular的$httpservice中,当在单页应用程序(在上面的帖子中解释)中使用时,将允许您的整个数据在页面重新加载(变成模板交换)时持久存在。
总的来说,浏览整个AngularJS教程,看看如何将其方法应用于您的应用程序。它会节省您很多时间,因为Angular经过深思熟虑并处理了您现在正在尝试解决的所有这些问题。它确实有一个陡峭的学习曲线,但要坚持不懈。您现在可以先不考虑测试驱动开发(他们在教程中强调),而是专注于核心概念和功能。
还要看一下这篇流行的关于从Jquery转向Angular的文章,它可能会有所帮助:如果我有jQuery背景,如何思考AngularJS?

0

目前我正在使用以下方式进行修复,

var $scope = angular.element('[ng-controller=ProductCtrl]').scope();

直到我学到更多为止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接