it-swarm.com.ru

AngularJS не работает, когда включена оптимизация ASP.NET MVC

У меня есть приложение, которое использует angularjs и работает нормально, когда для оптимизации задано значение false в файле BundleConfig.cs.

Но когда я установил оптимизацию на true, моя работа с выражениями angular означает, что angular загружается, но мои службы и контроллер не работают, а другие jquery/javscript работают нормально.

У вас есть идеи, что здесь происходит? Ниже приведен мой код

BundleConfig.cs

using System.Configuration;
using System.Web;
using System.Web.Optimization;

namespace HRMS
{
    public class BundleConfig
    {
        // For more information on bundling, visit http://go.Microsoft.com/fwlink/?LinkId=301862
        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/angular")
                .Include("~/Scripts/common/angular.js"
            ));
            bundles.Add(new ScriptBundle("~/bundles/app")
                .Include("~/Scripts/angular/app.js"
            ));
            bundles.Add(new ScriptBundle("~/bundles/common")
                .Include("~/Scripts/common/common.js"));

            bundles.Add(new ScriptBundle("~/bundles/services")
                .IncludeDirectory("~/Scripts/angular/services", "*.js"));

            bundles.Add(new ScriptBundle("~/bundles/controller")
                .IncludeDirectory("~/Scripts/angular/controller", "*.js"));


            bundles.Add(new ScriptBundle("~/bundles/jquery")
                .Include("~/Scripts/common/jquery-{version}.js"
                        , "~/Scripts/common/jquery-ui.js"));









            bundles.Add(new ScriptBundle("~/bundles/metis").Include(
                        "~/Scripts/common/plugins/metisMenu/metisMenu.min.js",
                        "~/Scripts/common/sb-admin-2.js"));

            // Use the development version of Modernizr to develop with and learn from. Then, when you're
            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/common/modernizr-*"));

            bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                      "~/Scripts/common/bootstrap.js",
                      "~/Scripts/common/respond.js"));

            bundles.Add(new ScriptBundle("~/bundles/select2").Include(
                      "~/Scripts/common/plugins/select2/select2.js"));

            bundles.Add(new ScriptBundle("~/bundles/tinymce").Include(
                      "~/Scripts/common/plugins/tinymce/tinymce.min.js"));

            bundles.Add(new StyleBundle("~/Content/css").Include(
                      "~/Content/bootstrap.css",
                      "~/Content/sb-admin-2.css",
                      "~/Content/plugins/metisMenu/metisMenu.min.css",
                      "~/Content/font-awsm/css/font-awesome.css",
                      "~/Content/plugins/select2.css",
                      "~/Content/plugins/select2-bootstrap.css",
                      "~/Content/jquery-ui.css"));


            BundleTable.EnableOptimizations =
            bool.Parse(ConfigurationManager.AppSettings["BundleOptimisation"]);

        }

    }
}

Моя страница макета:

<!DOCTYPE html>
<html lang="en" ng-app="allyhrms">
<head>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>@ViewBag.Title - Ally HRMS</title>

        @Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/common")


@Scripts.Render("~/bundles/angular")
@Scripts.Render("~/bundles/app")
@Scripts.Render("~/bundles/services")
@Scripts.Render("~/bundles/controller")



@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/metis")
@Scripts.Render("~/bundles/tinymce")
@Scripts.Render("~/bundles/select2")
    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
    @RenderSection("Script", false)
</head>

App.js // для приложения angular

(function () {
    var ally = angular.module('allyhrms', []);
})();

Мои услуги сделаны с этим стилем. например один из моих сервисов похож. LocationService.js

angular.module('allyhrms').service('LocationService', function ($http) {
    this.States = function () {
        return GetData($http, "/Location/States", {});
    };
    this.Cities = function (model) {
        return PostData($http, "/Location/Cities", { s: model });
    }
});

LocationController.js

angular.module('allyhrms').controller('LocationController', [
    'LocationService', 'ExceptionService', '$scope', function (locationService, exceptionService, $scope) {
        $scope.State = {
            Id: 0,
            StateName: ''
        };
        $scope.City = {
            Id: 0,
            StateId: 0,
            CityName: ''
        }
        $scope.States = [];
        $scope.Cities = [];
        function loadData() {
            locationService.States().then(function(response) {
                $scope.States = response.data.model;
            });

        }
        loadData();
        $scope.onStateChanged = function() {
            locationService.Cities($scope.State).then(function(response) {
                $scope.Cities = response.data.model;
            });
        };
    }
]);
14
user2539602

Это очень распространенная проблема, которая возникает при использовании встроенной аннотации для введения зависимостей, а не при использовании массива строк .

Итак, если вы делаете это:

.controller('dummyController', function($scope){...})

Вы должны делать это:

.controller('dummyController', ['$scope', function($scope){...}])

Например: в вашем коде вы делаете это, что не будет хорошо работать, когда код минимизируется:

angular.module('allyhrms').service('LocationService', function ($http) {
    this.States = function () {
        return GetData($http, "/Location/States", {});
    };
    this.Cities = function (model) {
        return PostData($http, "/Location/Cities", { s: model });
    }
});

Вы должны делать это так:

angular.module('allyhrms').service('LocationService',['$http', function ($http) {
    this.States = function () {
        return GetData($http, "/Location/States", {});
    };
    this.Cities = function (model) {
        return PostData($http, "/Location/Cities", { s: model });
    }
}]);
26
Josep

Для меня проблема заключалась в том, что версия select2 моего минифицированного и неинициализированного select2.js была другой и несовместимой, поэтому для оптимизации использовался мой минимизированный файл, который был несовместим с моей платформой, из-за чего select2 не был виден

0
mohas