【问题标题】:AngularJS Dynamic routing with paramaters best practice [closed]AngularJS动态路由与参数最佳实践[关闭]
【发布时间】:2017-12-02 16:12:32
【问题描述】:

我有动态路由,我正在努力确保尽可能高效地切换状态。

如果我有一个状态,例如前伪代码

.state("apartmentDetails", {
        url: "/apartmentDetails/:id",
        templateUrl: "templates/apartmentDetails.html",
        controller: apartmentDetailsCOntroller
})

我的控制器是否会获取参数 id,然后例如调用服务或从文件中获取数据(这是包含图片、价格、建筑物名称等和其他属性的公寓对象列表)

也许运行一个像 buildApartmentTemplate() 这样的函数然后我去构建模板并通过 $scope 传递数据?这是我能想到的唯一方法,但我确信有一种更好的方法,它不涉及必须填充模板的函数。是否有最佳实践可以使其更具活力?

【问题讨论】:

  • 这个问题与 Stackoverflow 无关,因为它主要基于意见。如果您提出问题的动机是“我想参加关于______的讨论”,那么您不应该在这里提问。但是,如果您的动机是“我希望其他人向我解释______”,那么您可能没问题。

标签: javascript angularjs routing angular-ui-router


【解决方案1】:

更好的选择是在路由定义中使用promise,如果promise被解决,则注入结果,使用这种方法可以避免加载模板后不必要的查询,如果promise被拒绝,你可以重定向到404页面或任何你想要的.

app.service('apartamentService', ['$http', function ($http) {
  this.list = function (id) {
       return $http({url: '/apartaments/' + id});
	};	
}]);
		
 app.config(['$routeProvider',
function ($routeProvider) {
	$routeProvider
		.when('/apartmentDetails/:id/', {
		templateUrl: 'templates/apartmentDetails.html',
		controller: 'apartmentDetailsController ',
		resolve: {
			apartaments: ['$route', 'apartamentService',
				function ($route, apartamentService) {
					return apartamentService.list($route.current.params.id)
				}]
			}});
					
}]);

app.controller('apartmentDetailsController', ['$scope', 'apartaments', function ($scope, apartaments) {
	$scope.apartaments = apartaments;	
}]);

希望能帮到你

【讨论】:

  • populateView()的作用是什么?根据路由中的参数从服务器加载公寓列表?如果这是它的功能,那么答案是否定的。
【解决方案2】:

这可能会对您有所帮助。

我通常做的是在加载某些组件之前解决我的所有问题,例如:

state("apartmentDetails", 
{ 
url: "/apartmentDetails/:id", 
templateUrl: "templates/apartmentDetails.html", 
controller: apartmentDetailsCOntroller,
resolve: {
  someResolvedData: ($stateParams) => {
     return YourService.getMyData($stateParams.id);
  }
}
})

您还需要为someResolvedData 创建一个绑定,您的解析数据将在控制器或模板中可用。 YourService 是您的服务的名称(不要忘记注入它),getMyData() 是服务上的一些函数,它将返回数据。

在此处查看有关解析数据的更多信息:

https://toddmotto.com/resolve-promises-in-angular-routes/

https://medium.com/opinionated-angularjs/advanced-routing-and-resolves-a2fcbf874a1c

【讨论】:

  • pegla 我明白你的意思,但现在在我有了数据之后,如何在不运行名为 populateView() 之类的函数的情况下填充视图,该函数传递该数据并构建模板。有没有办法在不调用一些 populateView() 函数的情况下做到这一点
  • 对不起,我不明白你在 populateView() 函数中做什么。您通过解析获取数据,然后在模板上显示数据 - 因为您在控制器/范围内的任何地方都有数据。我不明白你想用那个填充视图功能实现什么你能更新你的问题吗?如果你想根据 url slug 切换不同的模板,你需要使用 templateProvider 并根据 slug 返回想要的模板。
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多