【问题标题】:App Structure for a SPA - AngularJSSPA 的应用程序结构 - AngularJS
【发布时间】:2016-08-17 12:39:01
【问题描述】:

我有一个 MEAN Stack 应用程序,它以前是基于服务器的应用程序,现在我正在尝试将其转换为单页应用程序。

我目前的结构:

  • 我有一个加载主视图的 index.ejs 文件,它包含ng-view 标签。
  • index.ejs 文件有一个包含 5 个项目的菜单。每个项目在 ng-view 中加载一个新视图。
  • 每个菜单项都会加载一个新视图,并且每个菜单项都有自己的控制器。

我的问题:

目前我所有的功能都在一个控制器下,所以当我使用 ngRoute 时,它​​看起来像这样:

myCtrl.config(function($routeProvider) {
    $routeProvider

        // route for the home page

        .when('/', {
            templateUrl: '/test.ejs',
            controller: 'myCtrl1',
        })

        // route for the about page
        .when('/proposals', {
            templateUrl: '/profile.ejs',
            controller: 'myCtrl1'
        })

        // route for the contact page
        .when('/bios', {
            templateUrl : '/test2.ejs',
            controller  : 'myCtrl1'
        }); 
});

这导致我的控制器文件包含大量代码。我想根据它们的特征来划分它们。所以每个视图都应该有自己的控制器。

我的问题:

  1. 对于此类场景,正确的应用结构是什么。
  2. 我怎样才能像这样将外部控制器放入 ngRoute:

        myApp.controller('myCtrl1',function($scope){});
    
        .when('/', {
            templateUrl: '/test.ejs',
            controller: 'myCtrl1', // INTERNAL CONTROLLER
        })
    
    
        .when('/proposals', {
            templateUrl: '/profile.ejs',
            controller: '/directory2/js/myCtrl2' //EXTERNAL CONTROLLER
        })
    

我不确定这里的正确方法是什么。我想让我的应用模块化并实现关注点分离。

【问题讨论】:

  • 我认为你应该有一个最抽象的MainCtrl,它定义在div 包装你的ng-viewbody 标签上,每个视图都有自己独立的控制器.
  • @notgiorgi 你能举个例子吗?
  • 好的,我会发布它作为答案。
  • 你检查过 mean.js 或 mean.io 框架

标签: javascript angularjs controller single-page-application mean-stack


【解决方案1】:

如果您使用here 描述的基于组件的架构,您可以具有以下结构:

路由器

angular.module('myModule', ['ngRoute', 'dashboard', 'calendar'])
.config(['$locationProvider', '$routeProvider',
function config($locationProvider, $routeProvider) {
    $locationProvider.hashPrefix('!');

    $routeProvider.when('/dashboard', {
        template: '<dashboard></dashboard>',
        controller: function ($rootScope) {
            $rootScope.name = "Dashboard";
        }

    }).when('/calendar', {
        template: '<calendar></calendar>',
        controller: function ($rootScope) {
            $rootScope.name = "Calendar events";
        }

    }).otherwise('/dashboard');
}
])

然后您的仪表板可以是:

angular.
module('dashboard').
component('dashboard', {
    controller: DashboardController,
    templateUrl: 'dashboard/dashboard.html'

});

【讨论】:

  • 非常感谢您的回答。你有没有机会提供一个可行的例子?我还是有点困惑。
  • @Lorenzo 类似于jsfiddle.net/jtx06r0p 我正在尝试使用此示例来处理 JSFiddle,但有一些问题。
猜你喜欢
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 2019-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多