我试图设置我的第一个角度项目之一,并且无法掌握路线。
在页面加载时,我看到了由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>
答案 0 :(得分:1)
为了使路由工作,您可以创建不同的视图及其相关的控制器&amp;然后在该视图中有指令。此外,您还需要在index.html中使用ng-view指令,其中所有路径视图都将被加载。并且preferencesDirective
也应该只包含可重复使用的独特功能,&amp;完整的应用程序视图,以便您可以使用不同的数据集和不同的视图组件来获得不同的视图。
因此,您的模板可以是:
<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你可以查看当前的路由&amp;将不同的数据发送到preferencesDirective的控制器。
现在,如果您必须有条件地更改指令模板,请使用ng-include inside指令模板。
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。