Javascript 在状态之间传递对象
我一直在尝试使用angular将模板page1中单击的对象传递给另一个名为page2的模板。我可以使用ng click访问此对象,但无法将其传递到其他模板。我已经读过使用state.go()可能有用的文章,但我还没有弄明白这一点。如果state.go()不是一个好主意,我应该用什么来代替Javascript 在状态之间传递对象,javascript,angularjs,object,Javascript,Angularjs,Object,我一直在尝试使用angular将模板page1中单击的对象传递给另一个名为page2的模板。我可以使用ng click访问此对象,但无法将其传递到其他模板。我已经读过使用state.go()可能有用的文章,但我还没有弄明白这一点。如果state.go()不是一个好主意,我应该用什么来代替 angular.module('操场',[]) .config(函数($stateProvider,$urlRouterProvider){ “严格使用”; /*设置应用程序不同部分的状态*/ $stateP
angular.module('操场',[])
.config(函数($stateProvider,$urlRouterProvider){
“严格使用”;
/*设置应用程序不同部分的状态*/
$stateProvider
.state('page1'{
名称:“第1页”,
url:“/page1”,
templateUrl:'page1.html',
控制器:“MainCtrl”
})
.州(第2页){
名称:“第2页”,
url:“/page2”,
templateUrl:'page2.html',
控制器:“MainCtrl”
});
$urlRouterProvider。否则('/page1');
})
.controller('MainCtrl',函数($scope,$state){
“严格使用”;
$scope.add=函数(项,$stateParams){
如果($scope.ordered.indexOf(item)>-1){
//现在没有
}否则{
$scope.ordered.push(项目);
}
log($scope.ordered);
};
$scope.ordered=[]
$scope.menu=[{
标题:“披萨”,
输入:“主菜”,
最喜欢的:真的,
价格:10
}, {
标题:"玉米卷",,
输入:“主菜”,
最喜欢的:假,
价格:5元
}, {
标题:“洋葱圈”,
键入:“应用程序”,
最喜欢的:假,
价格:2
}, {
标题:"冰激凌",,
类型:“甜点”,
最喜欢的:假,
价格:11
}, {
标题:“Mac n奶酪”,
键入:“应用程序”,
最喜欢的:假,
价格:7
}, {
标题:“沙拉”,
类型:'沙拉',
最喜欢的:真的,
价格:4
}];
$scope.ordered=[];
});代码>
{{item.title}
{{item.type}
添加
{{item.title}
{{item.type}
去除
当您想要共享数据时,您可以使用angular service,因为所有angular service都是单态的,所以您可以轻松地在控制器和状态之间共享数据
例如:
控制器1
(() => {
function Controller1($scope, Service) {
$scope.test = 'In Controller 1';
$scope.service = Service;
$scope.menu = [
{
title: 'Pizza',
type: 'entree',
favorite: true,
price: 10
},
{
title: 'Tacos',
type: 'entree',
favorite: false,
price: 5
},
{
title: 'Onion Rings',
type: 'app',
favorite: false,
price: 2
},
{
title: 'Ice Cream',
type: 'dessert',
favorite: false,
price: 11
},
{
title: 'Mac n Cheese',
type: 'app',
favorite: false,
price: 7
},
{
title: 'Salad',
type: 'salad',
favorite: true,
price: 4
}
];
setTimeout(() => {
//Assign our data to the data service
Service.data = $scope.menu;
//Update the bindings
$scope.$apply();
}, 1000);
}
angular
.module('app', [])
.controller('Ctrl1', Controller1);
})();
控制器2
(() => {
function Controller2($scope, Service) {
$scope.test = 'In Controller 2';
//Retrieve instance of our data Service
$scope.service = Service;
}
angular
.module('app')
.controller('Ctrl2', Controller2);
})();
服务
(() => {
function Service() {
const obj = {
data: ''
};
return obj;
}
angular
.module('app')
.factory('Service', Service);
})();
Html
<body ng-app="app">
<div ng-controller="Ctrl1">
{{test}}
<pre>{{menu | json}}</pre>
</div>
<div ng-controller='Ctrl2'>
{{test}}
<pre>{{service.data | json}}</pre>
</div>
</body>
{{test}}
.state('state1', {
url: "/state1",
templateUrl: 'modules/states/state1.html',
controller: 'state1Controller',
controllerAs: 'state1Vm',
params: { 'stateVals': '' }
})
state1Vm.selectedVals = {
"key1": state1Vm.content,
"key2": state1Vm.userInputs
}
$state.go('state2', { stateVals: state1Vm.selectedVals });
{{menu}json}
{{test}}
.state('state1', {
url: "/state1",
templateUrl: 'modules/states/state1.html',
controller: 'state1Controller',
controllerAs: 'state1Vm',
params: { 'stateVals': '' }
})
state1Vm.selectedVals = {
"key1": state1Vm.content,
"key2": state1Vm.userInputs
}
$state.go('state2', { stateVals: state1Vm.selectedVals });
{{service.data | json}
在本例中,我们使用数据服务将数据从控制器1传递到控制器2。你可以对你的州做同样的事情
您可以看到当您想要共享数据时,您可以使用angular service,因为所有angular services都是单例,因此您可以轻松地在控制器和状态之间共享数据
例如:
控制器1
(() => {
function Controller1($scope, Service) {
$scope.test = 'In Controller 1';
$scope.service = Service;
$scope.menu = [
{
title: 'Pizza',
type: 'entree',
favorite: true,
price: 10
},
{
title: 'Tacos',
type: 'entree',
favorite: false,
price: 5
},
{
title: 'Onion Rings',
type: 'app',
favorite: false,
price: 2
},
{
title: 'Ice Cream',
type: 'dessert',
favorite: false,
price: 11
},
{
title: 'Mac n Cheese',
type: 'app',
favorite: false,
price: 7
},
{
title: 'Salad',
type: 'salad',
favorite: true,
price: 4
}
];
setTimeout(() => {
//Assign our data to the data service
Service.data = $scope.menu;
//Update the bindings
$scope.$apply();
}, 1000);
}
angular
.module('app', [])
.controller('Ctrl1', Controller1);
})();
控制器2
(() => {
function Controller2($scope, Service) {
$scope.test = 'In Controller 2';
//Retrieve instance of our data Service
$scope.service = Service;
}
angular
.module('app')
.controller('Ctrl2', Controller2);
})();
服务
(() => {
function Service() {
const obj = {
data: ''
};
return obj;
}
angular
.module('app')
.factory('Service', Service);
})();
Html
<body ng-app="app">
<div ng-controller="Ctrl1">
{{test}}
<pre>{{menu | json}}</pre>
</div>
<div ng-controller='Ctrl2'>
{{test}}
<pre>{{service.data | json}}</pre>
</div>
</body>
{{test}}
.state('state1', {
url: "/state1",
templateUrl: 'modules/states/state1.html',
controller: 'state1Controller',
controllerAs: 'state1Vm',
params: { 'stateVals': '' }
})
state1Vm.selectedVals = {
"key1": state1Vm.content,
"key2": state1Vm.userInputs
}
$state.go('state2', { stateVals: state1Vm.selectedVals });
{{menu}json}
{{test}}
.state('state1', {
url: "/state1",
templateUrl: 'modules/states/state1.html',
controller: 'state1Controller',
controllerAs: 'state1Vm',
params: { 'stateVals': '' }
})
state1Vm.selectedVals = {
"key1": state1Vm.content,
"key2": state1Vm.userInputs
}
$state.go('state2', { stateVals: state1Vm.selectedVals });
{{service.data | json}
在本例中,我们使用数据服务将数据从控制器1传递到控制器2。你可以对你的州做同样的事情
您可以看到,我一直在使用Angularjs的$stateParams
服务来实现这一点。在路由器js文件中,为每个状态定义路由,需要定义1个参数“params”,如下所示:
state2Vm.selectedVals = {
"key1": $stateParams.stateVals.key1,
"key2": $stateParams.stateVals.key2
};
同样,为state2定义此参数,以及从state1导航到后面的位置
现在,在从state1导航到state2之前,您可以在state2中设置要访问的对象,如下所示:
state2Vm.selectedVals = {
"key1": $stateParams.stateVals.key1,
"key2": $stateParams.stateVals.key2
};
到达state2时,您可以在state2的控制器中获得此对象,如下所示:
state2Vm.selectedVals = {
"key1": $stateParams.stateVals.key1,
"key2": $stateParams.stateVals.key2
};
请注意,您需要在两个控制器中注入$stateParams
。我一直在使用Angularjs的$stateParams
服务来实现这一点。在路由器js文件中,为每个状态定义路由,需要定义1个参数“params”,如下所示:
state2Vm.selectedVals = {
"key1": $stateParams.stateVals.key1,
"key2": $stateParams.stateVals.key2
};
同样,为state2定义此参数,以及从state1导航到后面的位置
现在,在从state1导航到state2之前,您可以在state2中设置要访问的对象,如下所示:
state2Vm.selectedVals = {
"key1": $stateParams.stateVals.key1,
"key2": $stateParams.stateVals.key2
};
到达state2时,您可以在state2的控制器中获得此对象,如下所示:
state2Vm.selectedVals = {
"key1": $stateParams.stateVals.key1,
"key2": $stateParams.stateVals.key2
};
请注意,您需要在两个控制器中注入$stateParams
。谢谢您的帮助,Paul,但我似乎无法让它工作。我看到你在用()=>您的代码中有很多。引用的是什么?当我尝试此操作时,它告诉我服务是未知的服务提供商。这只是匿名函数的ES6语法。一般来说,将模块声明包装到匿名函数中是一个很好的做法,以便将其与页面上的其他代码隔离。您可以将此语法替换为e传统的(function(){/***})(
。谢谢你的帮助,Paul,但我似乎无法让它工作。我看到你正在使用()=>您的代码中有很多。引用的是什么?当我尝试此操作时,它告诉我服务是未知的服务提供商。这只是匿名函数的ES6语法。一般来说,将模块声明包装到匿名函数中是一个很好的做法,以便将其与页面上的其他代码隔离。您可以将此语法替换为e传统的(函数(){/**/})(
)。