2014-12-20 6 views
1

Я хотел бы иметь объект как параметр для моего маршрута, но я начинаю с номера, чтобы проверить маршрут, и он не работает.Угловой маршрут с параметрами не работает

Вот мои маршруты:

// configure our routes 
    app.config(function($routeProvider, $locationProvider) { 
     $routeProvider 

      // route for the home page 
      .when('/', { 
       controller : 'ApplicationController', 
       templateUrl : './includes/home/home.html', 
      }) 

      .when('/voir_message/:message', { 
       templateUrl : './includes/messages/voir_message.html', 
       controller : 'VoirMessagesController', 
       controllerAs : 'controller' 
      }) 

      .otherwise({redirectTo : '/'}); 

     // use the HTML5 History API 
     $locationProvider.html5Mode(true); 

    }); 

Мой контроллер:

app.controller('VoirMessagesController', function($scope, $rootScope, $location, userService, dataRefreshServices){ 
    $scope.message = $routeParams.message; 
}); 

Когда мне нужно изменить свой маршрут я использую:

$location.path('voir_message/1'); 

, которые не работают, когда Я нажимаю на ссылку (которая вызывает функцию javascript и вызывает эту строку) моя страница перенаправляется в файл: ///

1 - Почему? Если я удалю «/ 1» и «: сообщение» в маршрутах (поэтому без прохождения какого-либо параметра), он отлично работает.

2 - После того, как мне нужно поместить свой объект, могу ли я просто поставить «JSON.stringify (myObject)» вместо «1»?

3 - И последний вопрос о моих маршрутах, почему адрес начинается с «file: ///»? Например, страница индекса «файл: ///» (я использую nodewebkit), поэтому, когда я загрузить приложение у меня есть следующее сообщение об ошибке:

Failed to load resource: net::ERR_FILE_NOT_FOUND file:/// 

Я обнаружил, что проблема с моим основным маршрутом , если я изменю «RedirectTo: '/' URL-адрес лучше, но все еще есть ошибка:

.when('/home', { 
       controller : 'ApplicationController', 
       templateUrl : './includes/home/home.html', 
      }) 

      .otherwise({redirectTo : '/home'}); 

EDIT мое приложение:

var app = angular.module('client', ['ngRoute', 'pascalprecht.translate']); 

используется в моей index.html, как т его:

<html xmlns="http://www.w3.org/1999/xhtml" data-ng-app="client"> 
+0

нужно всего лишь головы: вы инъекционный $ routeParams дважды в контроллере – topheman

+0

Fixed но ничего не меняет – user2088807

+0

Как получить доступ к вашему приложению через браузер? – Eugene

ответ

0

ОК, поэтому я получил это, чтобы работать, но нужно сделать несколько вещей, чтобы он работал правильно и больше, чтобы проверить его правильно.

  1. ваши настройки вверх историю html5 апи Im не 100% уверен, но это, кажется, является частью проблемы, а так как с узлом-WebKit вы действительно не видите URL, нет причин, чтобы это нужно. поэтому я удалил его. и это помогло.

    // use the HTML5 History API
    $locationProvider.html5Mode(true);

  2. Вы развернув приложение в HTML с:
    <html xmlns="http://www.w3.org/1999/xhtml" data-ng-app="client"> с помощью узла-WebKit я не смог проверить $location службы без вручную развернув угловое приложение, поэтому удалите data-ng-app="client" часть.

  3. , потому что мы удалили ng-app директиву теперь мы должны вручную начальной загрузки приложения в коде, который идеально подходит, потому что развернув приложение возвращает приложения dependencyInjector, которые нам необходимо будет проверить $location обслуживание.

  4. Вы спрашиваете Угловым загружать файлы из файловой системы, когда вы кладете:
    templateUrl : './includes/home/home.html', внутри ваших объектов определения маршрута, где еще это загрузить файл с? поэтому вместо того, чтобы просить его, чтобы загрузить файлы из файловой системы, просто дать HTML прямо в приложение, с помощью углов главного шаблона HTML синтаксиса:
    <script type="text/ng-template" id="home.html">
    <!-- your html for the template goes here -->
    </script>

    затем изменить определение маршрута объектов templateUrl приписывать соответствует идентификатор тега сценария, а именно: templateUrl : "home.html",

  5. как только вы сделаете все эти изменения есть только еще одна вещь, чтобы иметь в виду при изменении угловых взгляды внутри функции: изменить вид внутри функции в угловых вы должны сделать 2 вещи:

    1. Вызови path метод из $location сервиса, который вам нужен будет захватить его (и любые другие услуги, необходимые для проверки т.е. : $routeParams и $route) с помощью ваших приложений injector, которые возвращаются при вызове angular.bootstrap так:

      var $injector = angular.bootstrap(document.body,['client']);
      var $location = $injector.get("$location");
      // these arent from your example, but needed for testing
      var $route = $injector.get("$route");
      var $rootScope = $injector.get("$rootScope");
      var $routeParams = $injector.get("$routeParams");
      var $controller = $injector.get("$controller");

      • теперь в вашем контроллере или где изменить URL с
        $location.path("/voir_message/2");
      • затем обновить текущий маршрут и его параметры вызовите reload метод на $route службы ,
        $route.reload()

теперь на самом деле проверить, что он работал, мы должны загрузить контроллер с помощью дополнительных услуг, которые мы загрузили второй назад, как это:

var ctrl = $controller('VoirMessageController',{'$scope':$rootScope.$new()}); 

и если вы добавите звонок в console.log($scope); внутри вашего контроллера, вы увидите, что $scope теперь содержит { 'message' : 2 }

также, убедитесь, что у вас есть <ng-view></ng-view> где-то внутри ваш файл index.html, или угловатое обыкновение загружать ваши маршруты, когда ваше приложение бутстрапированная

Смежные вопросы