asp.net-mvc - 将 SPA 分割为多个组件并使用 AngularJS

标签 asp.net-mvc angularjs asp.net-web-api

我是 AngularJS 的初学者,所以这可能是完全微不足道的事情。我正在构建一个带有 Web API 后端(包括登录/注销功能)的 Asp.net MVC 应用程序(实际上只是提供无关紧要的部分)。

我想在我的应用程序中使用 AngularJS。但我有点进退两难,如何将我的页面分割成几个独立工作的部分。假设这是我的页面的简化骨架。

Skeleton

问题

我应该如何在我的页面上构建 AngularJS 部分?

  1. 我应该为整个页面使用一个 ng-app 还是为页面上的每个单独组件使用多个非嵌套的?
  2. 如果是一个ng-app,我希望有一个ng-view,其中包含ContextContent 组件。
  3. 使用每个选项(单/多ng-app)进行客户端路由怎么样?

这是一种可行的方法,还是我应该以不同的方式思考 Angular 并以不同的方式构建它?

我可能应该为每个单独的组件设置单独的 Controller ,并使用单个身份验证服务(与服务器上的 Web API 通信)来提供用户授权的项目。

你会推荐什么?

请记住,我是 AngularJS 的初学者,但非常精通服务器端部分(MVC 和 API)。

最佳答案

让我尝试解决一些问题

Should I have a single ng-app for the whole page or have several non-nested ones for each individual component on my page?

每个 SPA 只能有 1 个 ng-app,因此每个组件不能有 ng-app。您可以为每个组件设置一个模块,这些模块可以绑定(bind)到 ng-app 相关模块中。

In case of a single ng-app I expect to have one ng-view that would include Context and Content components.

ng-view 将仅包含事件 View 的内容。它不需要有任何菜单。可能有像 RootController 之类的东西,它是整个应用程序的容器。 html 将由明显的 ng-viewng-include 数量组成。

类似于

<div ng-controller='RootController'>
   <div id="contextMenu"><ng-include  src='contextMenuTemplate'></div>
   <div id="primaryMenu" ><ng-include src='primaryMenuTemplate'></div>
   <div id="secondarMenu" ><ng-include src='secondaryMenuTemplate'></div>
   <div ng-view/>
</div>

在你的 RootController 中你会有一些类似的逻辑

if ($route.path) {
   $scope.contextMenuTemplate="path1";   //path corresponding to the route
}

或者您也可以创建一个对象映射并使用它来选择模板

var viewTemplates= [{
    path:"/home",
    contextMenuTemplate:"path1",
    primaryMenuTemplate:"path2",
    secondaryMenuTemplate:"path3"
}]

现在可以使用它来选择 ng-include 中的模板。

How about client-side routing with each individual option (single/multi ng-app)?

路由仅发生在 ng-view 部分。您可以根据主视图选择要加载的其他模板。您还可以查看ui-router用于高级路由内容。

更新 当身份验证和授权出现时,服务器和客户端都发挥各自的作用。服务器进行身份验证,然后可以使用该信息为不同的模板提供服务(无论用户是否经过身份验证),并且可以在同一 URL 上。例如,/home/leftnav 可以根据经过身份验证的用户提供不同的内容。在 Angular 端也可以做同样的事情,但是这个行为可以被绕过,因为它只是 javascript。对于 api 调用(使用 webapi)也是如此,服务器可以决定发回什么内容。

在客户端,可以使用服务\工厂来跟踪用户状态。像 UserService 这样的服务,具有像 CurrentUser 这样的方法\属性,可以提供当前登录用户的详细信息,并且可以注入(inject)到任何指令、过滤器、 Controller 中,以做出基于决策的指令、过滤器、 Controller 。是否以及什么用户登录..

关于asp.net-mvc - 将 SPA 分割为多个组件并使用 AngularJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20742510/

相关文章:

c# - 支持 GUID 和整数 ID 的 Web API 路由

javascript - 如何在 mvc c# 中使用 ajax 调用在条形图中绑定(bind)动态数据?

asp.net-mvc - MVC中的模型含义

javascript - 是否可以更改 Angular Material 的禁用事件 mdSwitch 的颜色?

javascript - 创建持续时间输入(mm :ss:ms) in an AngularJS directive

c# - 装饰 ASP.NET Web API IHttpController

javascript - 使用 Javascript 将参数从 URL 传递到隐藏表单字段 (Gridview)

javascript - 在单击函数上将模型值传递给 @Html.CheckBoxFor

javascript - AngularJS View 和 Controller 之间的耦合

c# - 内容类型 - WebAPI - 请求 header