无法通过 angular 服务在 2 html 文件之间传递参数
cannot pass parameters via angular service between 2 html file
我有 2 个 html 文件,我想通过 angular 服务在它们之间传递参数。
这些是我的文件:
index.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
</head>
<body>
<script type="text/javascript" src="services.js"></script>
<div ng-app="myApp" ng-controller="myCtrl2">
</div>
<a href="enter2.html">enter here</a>
<script>
var app=angular.module("myApp");
app.controller("myCtrl2", ['$scope','$location', 'myService',
function($scope, $location, myService) {
myService.set("world");
}]);
</script>
</body>
</html>
enter2.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
</head>
<body>
<script type="text/javascript" src="services.js"></script>
<div ng-app="myApp" ng-controller="myCtrl3">
hello {{x}}
</div><script type="text/javascript">
var app=angular.module("myApp");
app.controller("myCtrl3", ['$scope','$location', 'myService',
function($scope, $location, myService) {
$scope.x=myService.get();
}]);
</script>
</body>
</html>
services.js
var app=angular.module("myApp", []);
app.factory('myService', function() {
var savedData = {}
function set(data) {
savedData = data;
}
function get() {
return savedData;
}
return {
set: set,
get: get
}
});
为什么我无法在 enter2.html 中获取 "hello world",而是获取 "hello"(服务未找到 x)...?
听起来您需要为视图页面使用控制器
https://docs.angularjs.org/guide/controller
当您从 index.html 转到 enter2.html 时,整个页面会从头开始加载。对于您希望保留在浏览器中的数据,您可能需要使用高级 angular 概念,例如使用 ng-view
.
仅加载页面的一部分
如果您已经否决了这一点,请在卸载(window.onunload
事件)页面之前将数据保存在服务中的某处(可能是浏览器会话),然后在服务加载时从那里加载回来(window.onload
事件)也可以。
这里是working example based on your code.
我保留了您的 index.html 并添加了 ui-view 以获得单页应用程序。该应用使用 'ui.router'.
在myCtrl2中我将数据保存在服务中,并从myCtrl3中调用:
.controller('myCtrl2', ['$scope', 'myService', function($scope, myService) {
console.log('myCtrl2');
myService.set('world');
}])
.controller('myCtrl3', ['myService', function(myService) {
console.log('myCtrl3');
var vm = this;
vm.x = myService.get();
}])
为简单起见,我有一个 Javascript 文件:
angular.module('myApp', ['ui.router'])
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'index.html',
controller: 'myCtrl2',
controllerAs: 'vm'
})
.state('enter2', {
url: '/enter2',
templateUrl: 'enter2.html',
controller: 'myCtrl3',
controllerAs: 'vm'
});
})
.factory('myService', function() {
var savedData = {}
function set(data) {
savedData = data;
}
function get() {
return savedData;
}
return {
set: set,
get: get
}
})
.controller('myCtrl2', ['$scope', 'myService', function($scope, myService) {
console.log('myCtrl2');
myService.set('world');
}])
.controller('myCtrl3', ['myService', function(myService) {
console.log('myCtrl3');
var vm = this;
vm.x = myService.get();
}])
我也经常推荐使用 var vm=this 和 ControllerAs 来避免 $scope 问题。
index.html 如下所示...请注意 ui-sref 而不是 href:
<div ui-view="">
<a ui-sref="enter2">Enter here</a>
</div>
enter2.html 现在只是 div 部分和您的内容:
<div>
Hello {{ vm.x }}
</div>
如果有帮助请告诉我们。
附加信息:
我有 2 个 html 文件,我想通过 angular 服务在它们之间传递参数。
这些是我的文件:
index.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
</head>
<body>
<script type="text/javascript" src="services.js"></script>
<div ng-app="myApp" ng-controller="myCtrl2">
</div>
<a href="enter2.html">enter here</a>
<script>
var app=angular.module("myApp");
app.controller("myCtrl2", ['$scope','$location', 'myService',
function($scope, $location, myService) {
myService.set("world");
}]);
</script>
</body>
</html>
enter2.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
</head>
<body>
<script type="text/javascript" src="services.js"></script>
<div ng-app="myApp" ng-controller="myCtrl3">
hello {{x}}
</div><script type="text/javascript">
var app=angular.module("myApp");
app.controller("myCtrl3", ['$scope','$location', 'myService',
function($scope, $location, myService) {
$scope.x=myService.get();
}]);
</script>
</body>
</html>
services.js
var app=angular.module("myApp", []);
app.factory('myService', function() {
var savedData = {}
function set(data) {
savedData = data;
}
function get() {
return savedData;
}
return {
set: set,
get: get
}
});
为什么我无法在 enter2.html 中获取 "hello world",而是获取 "hello"(服务未找到 x)...?
听起来您需要为视图页面使用控制器 https://docs.angularjs.org/guide/controller
当您从 index.html 转到 enter2.html 时,整个页面会从头开始加载。对于您希望保留在浏览器中的数据,您可能需要使用高级 angular 概念,例如使用 ng-view
.
如果您已经否决了这一点,请在卸载(window.onunload
事件)页面之前将数据保存在服务中的某处(可能是浏览器会话),然后在服务加载时从那里加载回来(window.onload
事件)也可以。
这里是working example based on your code.
我保留了您的 index.html 并添加了 ui-view 以获得单页应用程序。该应用使用 'ui.router'.
在myCtrl2中我将数据保存在服务中,并从myCtrl3中调用:
.controller('myCtrl2', ['$scope', 'myService', function($scope, myService) {
console.log('myCtrl2');
myService.set('world');
}])
.controller('myCtrl3', ['myService', function(myService) {
console.log('myCtrl3');
var vm = this;
vm.x = myService.get();
}])
为简单起见,我有一个 Javascript 文件:
angular.module('myApp', ['ui.router'])
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'index.html',
controller: 'myCtrl2',
controllerAs: 'vm'
})
.state('enter2', {
url: '/enter2',
templateUrl: 'enter2.html',
controller: 'myCtrl3',
controllerAs: 'vm'
});
})
.factory('myService', function() {
var savedData = {}
function set(data) {
savedData = data;
}
function get() {
return savedData;
}
return {
set: set,
get: get
}
})
.controller('myCtrl2', ['$scope', 'myService', function($scope, myService) {
console.log('myCtrl2');
myService.set('world');
}])
.controller('myCtrl3', ['myService', function(myService) {
console.log('myCtrl3');
var vm = this;
vm.x = myService.get();
}])
我也经常推荐使用 var vm=this 和 ControllerAs 来避免 $scope 问题。
index.html 如下所示...请注意 ui-sref 而不是 href:
<div ui-view="">
<a ui-sref="enter2">Enter here</a>
</div>
enter2.html 现在只是 div 部分和您的内容:
<div>
Hello {{ vm.x }}
</div>
如果有帮助请告诉我们。
附加信息: