【发布时间】:2016-08-15 16:31:47
【问题描述】:
感谢 JoelCDoyle 对我之前提出的问题 (overflow question) 的帮助,我能够从 JSON 键值中获取一个 ID 并将其传递给另一个控制器,以便在末尾附加一个 API 地址调用。
这是上一篇文章的代码:
CarDetailService.$inject = ['$http', 'API'];
function CarDetailService($http, API) {
var CarDetailService = this;
CarDetailService.setCar = function(carId) {
CarDetailService.carId = carId;
};
CarDetailService.getCar = function() {
return $http.get(API + "/car/" + CarDetailService.carId);
};
}
myTasks.$inject = ['$scope', '$http', 'API', 'CarDetailService', '$state'];
function myTasks($scope, $http, API, CarDetailService, $state) {
$http.get( API + '/tasks' ).
success(function(data) {
$scope.mainTask = data;
console.log(data);
});
$scope.selectCar = function(carId) {
CarDetailService.setCar(carId);
$state.go('taskDetails');
};
}
// EDITED
carDetails.$inject = ['$scope', 'CarDetailService', '$http', 'API'];
function carDetails($scope, CarDetailService, $http, API) {
// console.log('Post injection: ' + CarDetailService.carId);
CarDetailService.getCar().success(function(details) {
$scope.details = details;
});
}
现在我已经能够将它添加到另一个控制器,只需从另一个控制器复制代码并更改一些如下内容:
myCars.$inject = ['$scope', '$http', 'API', 'CarDetailService', '$state'];
function myCars($scope, $http, API, CarDetailService, $state) {
$http.get( API + '/car' ).
success(function(data) {
$scope.myCars = data;
console.log(data);
});
$scope.selectCar = function(carId) {
CarDetailService.setCar(carId);
$state.go('taskDetails');
};
}
但现在我有两个其他控制器需要添加,但我似乎无法让它们工作。
第一个应该和前两个一样简单。我只是复制了上一个,并像以前一样更改了一些内容:
observedCars.$inject = ['$scope', '$http', 'API', 'CarDetailService', '$state'];
function observedCars($scope, $http, API, CarDetailService, $state) {
$http.get( API + '/car/?observed=true&offset=0&page_size=20' ).
success(function(data) {
$scope.observed = data;
console.log(data);
});
$scope.selectCar = function(carId) {
console.log('Car ID is ' + carId);
CarDetailService.setCar(carId);
$state.go('taskDetails');
console.log( 'Get Car is ' + CarDetailService.carId);
};
}
如您所见,我已将 id 的输出登录到控制台,以确保它正在抓取 ID 并且确实如此。它在控制台中打印 carID 和 CarDetailService.carId 以便告诉我它正在获取正确的 id 但它没有将其注入到 carDetails 控制器中。我大部分时间都被难住了。我很确定这与来自observedCars 控制器的原始API 调用有关:
/?observed=true&offset=0&page_size=20
但它仍然会获取正确的 ID 数据,只是没有将其注入到 carDetails 控制器中。
HTML ng-click 引用如下:
<div ng-repeat="task in mainTask.Tasks" class="myCar">
<div class="viewCar"><a ng-click="selectCar(task['CAR ID'])">View Details</a></div>
</div>
<div ng-repeat="car in myCars['My CARs']" class="myCar">
<div class="viewCar"><a ng-click="selectCar(car['CAR ID'])">View Details</a></div>
</div>
<div dir-paginate="obv in observed['Observed CARs'] | filter:q | itemsPerPage: 5" class="myCar">
<div class="viewCar"><a ng-click="selectCar(obv['CAR ID'])">View Details</a></div>
</div>
第二个我不知道是我的搜索控制器。它与observedCars 控制器做同样的事情。这个还在控制台中记录了正确的 CAR ID,但是当状态发生变化时,它不会加载它抓取的那个的 ID 信息。
代码如下:
function searchRes($scope, $http, API){
$scope.$watch('search', function() {
fetch();
});
$scope.currentPage = 1;
$scope.pageSize = 5;
function fetch(){
$http.get(API + "/search/" + $scope.search)
.then(function(data){
$scope.results = data;
});
}
$scope.select = function(){
this.setSelectionRange(0, this.value.length);
}
$scope.selectCar = function(carId) {
console.log('Car ID is ' + carId);
CarDetailService.setCar(carId);
$state.go('taskDetails');
console.log( 'Get Car is ' + CarDetailService.carId);
};
}
非常感谢任何帮助!
【问题讨论】:
-
您是使用路由参数还是状态参数将值从一个控制器传递到另一个控制器??
-
您应该查看 ui-router 的文档:github.com/angular-ui/ui-router/wiki/url-routing。您可以轻松地在状态之间传递 id 而不会遇到所有麻烦。
-
如果所有控制器都使用了 id,那么你将它们与 rootscope 一起使用
-
注入 rootscope - ['$scope', '$http', 'API', 'CarDetailService', '$state','$rootscope'] 并将 id 存储为 $rootscope.id = ID并在所有控制器中使用它
标签: javascript jquery angularjs json