2

我正在构建一个具有侧边栏和主要内容区域的 AngularJS 应用程序。两者都由 $http 服务的单独调用填充以检索一些 JSON 数据。侧边栏中的内容基本上是一个目录,其目的是单击侧边栏项目之一将导致主要区域被更新。

我最初的尝试是将侧边栏和主要区域放在一个部分中,然后将其与执行这两项检索的控制器相关联。应用程序有一个将控制器关联到 URL 的路由,侧栏中的链接使用适当的参数访问这些 URL,这将导致所需的内容出现在主区域中。所有这些都有效,但它确实会导致整个页面刷新。“部分”确实是“全部”。

我想做的是以某种方式导致单击侧边栏链接仅触发主要内容区域的刷新。一个想法是以某种方式将其拆分为两个控制器/部分对,并找出一种方法来导致侧边栏单击以请求更新。不过,我不确定这样做的机制。另一种方法是将内容保存在一个控制器中,并使用某种会触发此更新的共享状态。我试图通过在链接上设置一个 ng-click 指令来做到这一点,但这并没有像我希望的那样更新范围变量。

有没有推荐的构建应用程序的方法来实现这种 AJAX 驱动的部分页面更新?这似乎是一个相当普遍的情况,但我还没有掌握足够多的 AngularJS 来获得解决方案。

4

1 回答 1

8

这就是我正在做的事情:

我有 2 项服务,1 项用于侧边菜单,另一项用于主要内容。它们都被注入到控制器中。

$broadcast为了处理我用来发送事件的跨服务调用。

工作得很好,代码很干净。

根据评论使用服务的附加信息

对于 sidemenu,我有一个共享菜单服务,这样所有控制器都可以使用相同的菜单。

maincontent 服务不必共享,但我使用它们是因为当控制器超出范围时服务不会丢失它们的数据。如果我不这样做,控制器将不得不使用其他机制来重新填充其数据。对我来说,服务可以处理它而无需编写任何代码

为了显示不同的视图,我使用以下主要布局 html

<div >
    <!-- left menu -->
    <div id="left" ng-include src="menu.view" ></div>

    <!-- main content -->
    <div id="main" ng-include src="maincontent.view"></div>
</div>

控制器

function myControllerCtrl($scope, $rootScope, menuService, maincontentService) {
    $scope.menu = menuService;
    $scope.maincontent = mainContentService
}

菜单服务

app.factory('menuService', ['$rootScope', function ($rootScope) {
    var service = {
        view: 'leftmenuview.html',

        MenuItemClicked: function (data) {
            $rootScope.$broadcast('menuitemclicked', data);
        }
    };
    return service;
}]);

主要内容服务

app.factory('maincontentService', ['$rootScope', function ($rootScope) {
    var service = {
        view: 'maincontentview.html',

        MenuItemClicked: function(data){
          //handle updating of model based on data here
        }
    };

    $rootScope.$on('menuitemclicked', function (event, data) { service.MenuItemClicked(data) });

    return service;
}]);
于 2013-08-16T01:37:17.520 回答