【问题标题】:Routing issue with angular directives角度指令的路由问题
【发布时间】:2018-02-10 18:21:34
【问题描述】:

我正在尝试设置我的第一个 Angular 项目,但无法掌握路由。

在页面加载时,我看到了preferencesDirective设置的初始模板,这很棒。

当我单击“更改模板”按钮时,我希望它更改为另一个模板,但没有任何反应。如果我将 $routeProvider 中的模板 url 设置为无效,那么我会在调试器中看到 404 错误,告诉我某些东西必须正常工作,但是当模板 url 有效时没有任何反应。我如何让它正确更改?

谢谢。

<div id="PreferencesApp" class="" ng-app="clientPreferencesModule">    
    <preferences-directive factory-settings="clientPreferences"></preferences-directive>
    <a href="#Details">Change Template</a>
</div>


<script>

    var app = angular.module("clientPreferencesModule", ["ngResource", "ngRoute"]);
    //var app = angular.module("clientPreferencesModule", ["ngRoute"]);


    app.config(function ($routeProvider) {        
        $routeProvider.when("/", { controller: "clientPreferencesController", templateUrl: '/AngularTemplates/ClientPreferences/PreferencesTemplate.html' });
        $routeProvider.when("/Preferences/:id", { controller: "clientPreferencesController", templateUrl: '/AngularTemplates/ClientPreferences/PreferencesTemplate.html' });
        $routeProvider.when("/Preferences", { controller: "clientPreferencesController", templateUrl: '/AngularTemplates/ClientPreferences/PreferencesTemplate.html' });
        $routeProvider.when("/Details", { controller: "clientPreferencesController", templateUrl: '/AngularTemplates/ClientPreferences/DetailsTemplate.html' });                
    });



    app.controller('clientPreferencesController', clientPreferencesController);

    clientPreferencesController.$inject = ["$scope", "$resource", "$rootScope", "$http", "$route", "$location"];

    function clientPreferencesController($scope, $resource, $rootScope, $http, $route, $location) {        
        this.model = @Html.Raw(JsonConvert.SerializeObject(Model));        
        $scope.location = $location.path();        
    }

    app.directive('preferencesDirective', preferencesDirective);

    function preferencesDirective() {

        return {
            restrict: 'EA',
            scope:
            {
                factorySettings: '='
            },
            controller: 'clientPreferencesController',
            controllerAs: 'pc',
            bindToController: true,
            templateUrl: '/AngularTemplates/ClientPreferences/PreferencesTemplate.html'
        }
    }

</script>

【问题讨论】:

    标签: javascript angularjs angular-routing angular-directive angular-controller


    【解决方案1】:

    要使路由正常工作,您必须创建不同的视图及其关联的控制器,然后在该视图中设置指令。而且您还需要 index.html 中的 ng-view 指令,所有路由视图都将在其中加载。而且preferencesDirective 应该只包含可重用的独特功能和完整的应用程序视图,这样您就可以在不同的视图组件旁边拥有具有不同数据集的不同视图。 因此,您的模板可以是:

    <div id="PreferencesApp" class="" ng-app="clientPreferencesModule">    
        <a href="#Details">Change Template</a>
        <div ng-view></div>
    </div>
    

    现在对于不同的路由,您可以拥有每个不同的控制器,或者如果您想在一个控制器中处理它,则只有一个,但与指令的控制器不同,因此可以,

    app.config(function ($routeProvider) {        
        $routeProvider.when("/", { controller: "viewController", templateUrl: '/AngularTemplates/ClientPreferences/PreferencesTemplate.html' });
        $routeProvider.when("/Preferences/:id", { controller: "viewController", templateUrl: '/AngularTemplates/ClientPreferences/PreferencesTemplate.html' });
        $routeProvider.when("/Preferences", { controller: "viewController", templateUrl: '/AngularTemplates/ClientPreferences/PreferencesTemplate.html' });
        $routeProvider.when("/Details", { controller: "viewController", templateUrl: '/AngularTemplates/ClientPreferences/DetailsTemplate.html' });                
    });
    

    在所有这些模板中都有 preferencesDirective。 (这现在可能会更改指令的模板,但您可以更改视图模板中每个视图的 dom 并保持指令的模板不变) 现在在 viewController 中使用 $routeParams 可以检查当前路由并将不同的数据发送到 preferencesDirective 的控制器。

    现在,如果您必须有条件地更改指令模板,请在指令模板内使用 ng-include。

    function preferencesDirective() {
    
        return {
            restrict: 'EA',
            scope:
            {
                factorySettings: '=',
                templateSrc: '='
            },
            controller: 'clientPreferencesController',
            controllerAs: 'pc',
            bindToController: true,
            templateUrl: '<ng-include src="pc.template()"></ng-include>'
        }
    }
    
    function clientPreferencesController($scope, $resource, $rootScope, $http, $route, $location) {        
        this.model = @Html.Raw(JsonConvert.SerializeObject(Model));        
        $scope.location = $location.path();     
        $scope.template = function(){
            if($scope.templateSrc) {
                return '/AngularTemplates/ClientPreferences/'+ $scope.templateSrc + '.html';
            }
        }
    }
    

    这里根据当前路由从 viewController 分享那个 templateSrc。

    【讨论】:

    • 太完美了!!谢了哥们。知道我的方法有点错误,但找不到任何东西可以为我指明正确的方向。非常感谢。
    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2017-04-06
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多