gpt4 book ai didi

javascript - 使用路由添加的 Controller 在 Angular JS 中声明 $scope 变量?

转载 作者:行者123 更新时间:2023-11-28 07:37:48 25 4
gpt4 key购买 nike

我的应用程序是一个 SPA。它包括基于路线的模板。它还声明了一个基于路由的范围变量。我通过为 .config 服务上的每个路由设置一个 Controller 来完成最后一部分。

这是我的配置...

spa.config(function($routeProvider) {
$routeProvider
.when('/home', {
templateUrl: '/partials/home.html',
controller: 'homeController'
})
.when('/about', {
templateUrl: '/partials/about.html',
controller: 'aboutController'
})
.when('/skills', {
templateUrl: '/partials/skills.html',
controller: 'skillsController'
})
.when('/experience', {
templateUrl: '/partials/experience.html',
controller: 'experienceController'
})
.when('/resume', {
templateUrl: '/partials/resume.html',
controller: 'resumeController'
})
.when('/contact', {
templateUrl: '/partials/contact.html',
controller: 'contactController'
})
.otherwise({
redirectTo: '/home'
});
});

这些都是我的 Controller ...

/*Template Controllers*/

var homeController = spa.controller("homeController", function($scope) {
$scope.currentLink = "home";
})

var aboutController = spa.controller("aboutController", function($scope) {
$scope.currentLink = "about";
})

var skillsController = spa.controller("skillsController", function($scope) {
$scope.currentLink = "skills";
})

var experienceController = spa.controller("experienceController", function($scope) {
$scope.currentLink = "experience";
})

var resumeController = spa.controller("resumeController", function($scope) {
$scope.currentLink = "resume";
})

var contactController = spa.controller("contactController", function($scope) {
$scope.currentLink = "contact";
})

/*Dynamic CSS Linking*/

var cssController = spa.controller("cssController", function($scope) {
this.fileName = $scope.currentLink;
});

/*Navigation Controller*/

var navigationController = spa.controller("navigationController", function($scope) {
this.checkCurrent = function(checkValue) {
return $scope.currentLink == checkValue;
}
this.linkValues = [
{linkContent: "Home", linkValue: "home"},
{linkContent: "About", linkValue: "about"},
{linkContent: "Skills", linkValue: "skills"},
{linkContent: "Experience", linkValue: "experience"},
{linkContent: "Resume", linkValue: "resume"},
{linkContent: "Contact", linkValue: "contact"}
];
});

这是我的 HTML

<!DOCTYPE html>
<html ng-app="spa">
<head ng-controller="cssController as cssCtrl">
<title>
Allen Hundley
</title>
<!--Favicon-->
<link rel="shortcut icon" href="http://allenhundley.com/images/favicon.ico" type="image/x-icon">
<link rel="icon" href="http://allenhundley.com/images/favicon.ico" type="image/x-icon">
<!--End Favicon-->
<!--CSS-->
<link rel="stylesheet" type="text/css" href="http://allenhundley.com/css/base.css">
<link rel="stylesheet" type="text/css" ng-href="http://allenhundley.com/css/partials_css/{{ cssCtrl.fileName + '.css' }}">
<!--End CSS-->
<!--JavaScript Sources-->
<script type="text/javascript" src="http://allenhundley.com/resources/angular.js"></script>
<script type="text/javascript" src="http://allenhundley.com/resources/angular-route.js"></script>
<!--End JavaScript Source-->
<!--JavaScript-->
<script type="text/javascript" src="http://allenhundley.com/js/modules.js"></script>
<script type="text/javascript" src="http://allenhundley.com/js/services.js"></script>
<script type="text/javascript" src="http://allenhundley.com/js/controllers.js"></script>
<script type="text/javascript" src="http://allenhundley.com/js/directives.js"></script>
<!--End JavaScript-->
</head>
<body>
<div id="navigation">
<div id="link_wrapper" ng-controller="navigationController as navCtrl">
<navigation-links></navigation-links>
</div>
</div>
<div ng-view id="wrapper"></div>
</body>
</html>

所有 Controller 和工厂都应用于spa模块。

我页面中的链接指向新路线。那部分工作完美。此外,由路由添加的 Controller 声明一个范围变量,该变量稍后会被其他一些 Controller 获取。

首先使用此作用域变量的地方是 cssController。这个 Controller 的目的是动态链接一个属于 HTML 模板的 css 文件。

第二个使用此范围变量的地方是在 navigationController 中。虽然您看不到它,但在 element 指令的每个链接中都有一个指向 navigationControllercheckCurrent 函数的链接。此函数返回一个 bool 值,它会影响链接是否应用了 CSS,从而使其成为“事件”链接。

这里的问题是我的范围变量没有得到声明,或者我没有正确访问它。

我该如何实现?

最佳答案

您是否打算在应用中的所有 Controller 之间共享 currentLink?如果是,那么有几种方法可以做到这一点。

第一种方式是使用$rootScope。您使用的 $scope 不在 Controller 之间共享,它们是不同的实例,每个都绑定(bind)到声明 Controller 的 View 。 $rootScope 是您的顶级 $scope,每个应用程序只有一个实例,您可以方便地将它注入(inject)所有 Controller 。

var homeController = spa.controller("homeController", function($scope, $rootScope) {
$rootScope.currentLink = "home";
})

如果您没有太多需要在全局范围内共享的数据(您不应该这样做),则可以使用这种方法。如果您还有几个,甚至可以制作一个物体来固定它。

$rootScope.data = {};

第二种方式是使用服务。这是在选定 Controller 之间共享数据的更“正式”方式。需要数据的 Controller 将注入(inject)服务,不需要的 Controller 不会意识到它。有很多指南可以教您如何设置服务,这里只是其中一种方法。

spa.service('Navigation', function(){
this.currentLink= null;

// some people prefer get and set method here
// var currentLink;
// this.getLink = function() {return currentLink;}
// this.setLink = function(input) {currentLink = input;}

// and some uses an object wrapper for binding
// this.data = {currentLink: null};

// depends on which one suits your need and preference
});

在 Controller 中你注入(inject)它们并像$rootScope一样使用它

var homeController = spa.controller("homeController", function($scope, Navigation) {
Navigation.currentLink = "home";
})

编辑:在这种情况下,如果您尝试仅通过路由名称进行匹配,您可以只使用 $location.path() 来确定当前路径。

jsbin

关于javascript - 使用路由添加的 Controller 在 Angular JS 中声明 $scope 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31129041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com