是否可以在 MVC 局部视图中运行 AngularJS 应用程序

Posted

技术标签:

【中文标题】是否可以在 MVC 局部视图中运行 AngularJS 应用程序【英文标题】:Is it possible to run an AngularJS application inside an MVC Partial View 【发布时间】:2014-09-18 23:58:15 【问题描述】:

我正在尝试在 MVC 应用程序中运行 AnugularJS。在我看来,这可以通过创建小型 Angular 应用程序来完成,该应用程序将在 MVC 部分视图被推送到客户端时运行,这似乎是合乎逻辑的。

<link rel="stylesheet" type="text/css" href="http://angular-ui.github.com/ng-grid/css/ng-grid.css" />

<style>
    .gridStyle 
        border: 1px solid rgb(212,212,212);
        width: 600px;
        height: 124px;
    
</style>

<div ng-app="app">
    <div ng-controller="GridCtrl">
        <table cellspacing="5" cellpadding="5">
            <tr>
                <td valign="top">
                    <div dropdownlist="" options="options" ng-model="selectedCategory" 
                        on-change="onChangeCategoryList()"></div>
                </td>
                <td>
                    <div ng-show="contentAvailiable">
                        <div grid-angular=""></div>
                    </div>
                </td>
            </tr>
        </table>

    </div>
</div>

<script src="~/Scripts/Libraries/angular/angular.js"></script>
<script src="~/Scripts/Libraries/angular/angular-route.js"></script>

<script type="text/javascript" src="//rawgithub.com/angular-ui/ng-grid/v2.0.13/build/ng-grid.debug.js"></script>
<script src="~/app/app.js"></script>
<script src="~/app/controllers.js"></script>
<script src="~/app/directives.js"></script>
<script src="~/app/filters.js"></script>
<script src="~/app/services.js"></script>
    angular.module('app', ['ui.router', 'app.filters', 'app.services', 'app.directives', 'app.controllers', 'ngGrid'])


        .config(['$stateProvider', '$locationProvider', function ($stateProvider, $locationProvider) 

            $stateProvider
                .state('home', 
                    url: '/',
                    templateUrl: 'views/index',
                    controller: 'HomeCtrl'
                )
                .state('grid', 
                    url: '/grid',
                    templateUrl: 'views/grid',
                    controller: 'GridCtrl'
                );

          //  $locationProvider.html5Mode(true);

        ])


        .run(['$templateCache', '$rootScope', '$state', '$stateParams', function ($templateCache, $rootScope, $state, $stateParams) 

            var view = angular.element('#ui-view');
            $templateCache.put(view.data('tmpl-url'), view.html());

            // Allows to retrieve UI Router state information from inside templates
            $rootScope.$state = $state;
            $rootScope.$stateParams = $stateParams;

            $rootScope.$on('$stateChangeSuccess', function (event, toState) 

                $rootScope.layout = toState.layout;
            );
        ]);

我得到以下错误,而不是这个工作:

未捕获的错误:[$injector:modulerr] 无法实例化模块应用程序,原因是: 错误:[$injector:nomod] 模块“app”不可用!您要么拼错了模块名称,要么忘记加载它。如果注册模块,请确保将依赖项指定为第二个参数。

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

您需要确保在 ng-app 指令之前加载 Angular 文件。

只需将这些文件放入您的&lt;/head&gt;

<script src="~/Scripts/Libraries/angular/angular.js"></script>
<script src="~/Scripts/Libraries/angular/angular-route.js"></script>

<script type="text/javascript" src="//rawgithub.com/angular-ui/ng-grid/v2.0.13/build/ng-grid.debug.js"></script>
<script src="~/app/app.js"></script>
<script src="~/app/controllers.js"></script>
<script src="~/app/directives.js"></script>
<script src="~/app/filters.js"></script>
<script src="~/app/services.js"></script>

【讨论】:

【参考方案2】:

是的

这是可能的并且非常容易使用。只是您需要使用 ng-include("'controller/action'") 调用局部视图。 Apostrophe(') 在写 url 时很重要。

例子

 <div id="TestDiv" ng-include="templateUrl"></div>

在角度控制器内部

 var app = angular.module("Layout", []);
    app.controller("LoadPage", function ($scope, $http, $sce) 

   //Initially
    $scope.templateUrl = '/Home/DefaultPage';

    // To dynamically change the URL.
    $scope.NewProjFn = function () 
        $scope.templateUrl = '/Home/ProjectPage';
    ;
);

ng-include 获取、编译并包含外部 HTML 片段。 (这是一个解决方案,对我来说最适合部分视图)

【讨论】:

以上是关于是否可以在 MVC 局部视图中运行 AngularJS 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 MVC5 C# 和 Razor 在局部视图中运行 javascript

如何在 ASP.NET MVC 中控制局部视图的条件显示

MVC的局部视图

我可以在主视图的 Knockout 视图模型中使用 MVC 局部视图中的模型吗?

在 ASP.NET MVC 中使用 jQuery 渲染局部视图

MVC 4 模态窗口,局部视图和验证