Как передать переменную в $scope в $routeProvider

#angularjs #angularjs-scope

#angularjs #angularjs-scope

Вопрос:

Мне нужно передать переменную в $ scope в $ routeProvider. Код следующий:

 .when('/:zone/edit/:id', {
      templateUrl: 'views/edit.html',
      controller: 'EditSet'
    })
    .when('/articles/edit/:id', {
      templateUrl: 'views/edit-article.html',
      controller: 'EditSet',
      params: {zone: 'articles'}
    })
  

Для получения параметра я использую $scope.params.zone , который работает в первом случае (:zone) и не работает во втором случае.

Что мне следует делать в этом случае?

Ответ №1:

Поэтому я думаю, вам было бы лучше использовать функцию support в templateUrl для достижения этой цели:

 .when('/:zone/edit/:id', {
    templateUrl: function(params) {
        if (params.zone == "article") {
            return 'views/edit-article.html';
        }

        return 'views/edit.html';   
    },
   controller: 'EditSet'
})
  

Ответ №2:

В указанном вами порядке второй маршрут никогда не будет разрешен.

/:zone/edit/:id будет соответствовать любому значению для :zone . So /articles/edit/:id всегда будет разрешаться в /:zone/edit/:id , как и /foo/edit/:id or /asdhjkdajksa/edit/:id .

Кроме того, params: {zone: 'articles'} не является допустимым свойством маршрута. Если вам нужно, чтобы данные были установлены перед входом в контроллер, вы можете использовать resolve свойство (хотя я не уверен, что это то, что вам нужно в данном случае).

 .when('/articles/edit/:id', {
  templateUrl: 'views/edit-article.html',
  resolve: { zone: 'articles-zone' },
  controller: 'EditSet'
})
.when('/:zone/edit/:id', {
  templateUrl: 'views/edit.html',
  controller: 'EditSet'
})
  

Я не знаю, как $scope.params.zone у вас это работало, это должно быть $routeParams.zone после того, как вы введете $routeParams в определение вашего контроллера. Используя вышеуказанные маршруты и этот контроллер, вы получите следующие значения:

 angular.module('app').controller('EditSet', function($scope, $routeParams, zone) {
  console.log($routeParams.zone);
  console.log(zone);
});

/articles/edit/1
-> 'articles'
-> 'articles-zone'

/batman/edit/1
-> 'batman'
-> undefined
  

Взгляните на примеры документов, чтобы увидеть, как правильно форматировать маршруты.

Комментарии:

1. Большое вам спасибо за ваш ответ! Но resolve у меня не сработало, это вызывает ошибку. Я изменил порядок, как вы указали, так что теперь это работает.