2013-03-29 10 views
7

Hala angularjs öğreniyorum, belki de anlamıyorum aptalca bir şey var ama yönlendirme kullanırken gerçekten garip bir davranışım var. Benim uygulamada açısal bir şeyleri yönlendirmek garip bir şey oluyor

benim yolları tanımlamak için aşağıdaki kodu kullanın:

var app = angular.module('app', []); 
app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) { 
    $routeProvider. 
    when('/pneumatici/:chunka', {}). 
    when('/pneumatici/:chunka/:chunkb', {}); 

    $locationProvider.html5Mode(true); 
}]); 

Ve bir denetleyici ben onları bu şekilde yönetmek: hiçbir şablon, hiçbir şey hiçbir ngView var

app.controller('appCtrl', ['$scope', '$route', '$routeParams', '$location', function ($scope, $route, $routeParams, $location) { 
    $scope.$on('$routeChangeSuccess', function (current,previous) { 
    if (!($location.path().indexOf('/pneumatici') === -1)) { 
     $scope.chunka = $route.current.params.chunka; $scope.chunkb = $route.current.params.chunkb; 

     /** do my stuff with chunka and chunkb **/ 

    } else { 
     window.location.href = $location.path(); 
    } 
    }); 

. Bir çekicilik gibi çalışır.

URL'lerin denetleyici appCtrl tarafından yönetilmesinin amaçlanmadığı durumlarda, aslında sayfa yükünü zorladığım satırı not edin. Bunu yapmak zorunda kaldım çünkü bir kez rotama '$ routeChangeSuccess' yakalamak için tıkladığımda tıklanan sayfadaki tüm linkler açısal olarak yakalanır ve linkin 'when' ile tanımlanmış format olmasa bile herhangi bir sayfa yüklemesi olmaz . Bunu 'aksi halde' yapmak isterdim, ancak eğer yapılabilirse nasıl yapılacağını anlayamadım.

Şimdi sorun. Tabii sayfada '/privacy.html' gibi linkler var, eğer sayfa yükü doğru bir şekilde tetiklendiyse ve '/privacy.html' görüyorum ama ne yazık ki bir kez geri düğmesini tıklarsam Tarayıcının URL'sini (diyelim)/pneumatici/foo/bar olarak değiştirmeyi görebiliyorum ancak sayfa yükü tetiklenmiyor.

Lütfen privacy.html sayfasında tanımlanmış açısal yönlendirmenin olmadığını, no .config no .when; Bir denetleyici ile tanımlanan bir anagular uygulama var, ama hiçbir yerde '$ routeProvider' herhangi bir enjeksiyon yok, herhangi bir rotanın tanımı yok.

Neler oluyor? Ne yapıyorum yanlış?

Yardımlarınız için teşekkürler!

Güncelleştirme. bilmiyordum,

angular.element("a").prop("target", "_self"); 

Eğik yönlendirme "_self" olarak ayarlanmış 'hedefi' ile tüm 'a' elementler için göz ardı edilir: Ben ekleyerek uygulanabilir bir çözüm buldu.

Yine de bu stratejiye baktığımda tamamen bana çok şık gelmiyorsa ve bunu geliştirmek isterim. Sevmediğim şey, .config içindeki rotayı tanımladığımdan, orada tanımladığım biçim/yolla uyuşmayan herhangi bir URL'yi atlamak için açısal olarak söyleyebilmem gerekir.

Ama bunun yapılıp yapılamayacağını bilmiyorum, orada bilen var mı?

+0

Normal url şey yapmak zorunda neden emin değilim, iyi çalışması gerekir. '/ Privacy.html' için href'te karma önek mi koyuyorsunuz? – charlietfl

+0

İleri eğik çizgi "/" mi kastediyorsunuz? Tabii ki ben. –

+0

no, url hash '#' ile başlar ve '# /' ile açısal yol başlar ... normal URL'nizdeki eğik çizgiyi kaldırır ve muhtemelen # # orada olmadığı sürece iyi çalışır. Normal url için eğik çizgi önekini kullanmadan yapılan hızlı bir test, js gerektirmeden benim için iyi çalıştı – charlietfl

cevap

1

html5mode özelliğini açarak uygulamanızın varsayılan olarak (/ veya 'sitesinden) sitedeki her şeyi engellemesi gerektiği gibi davranmalıdır.

Bu bakış açısıyla, $ location.path() 'un açıkça geçersiz kılma işleminde çalışması gerektiği gibi görünüyor, ancak gerçekten doğru değil ($location.url() olurdu) ve tarayıcı zaten doğru URL'ye sahip olabilir, bu yüzden belki de Belirli bir tarayıcıda location.href = location.href ile yeniden yüklemeyi zorla.

Aksine bu yolda gidiş daha yapardım o KURU yapmak için aşağıdaki: Bir temel href eklerseniz

: (sizin when fıkrada / ile /pneumatici/

<base href="/pneumatici/"></base> 

ve değiştirme lar):

0:

sonra
$routeProvider. 
    when('/:chunka', {}). 
    when('/:chunka/:chunkb', {}); 

sadece bu gerektiğinde Hiçbir karma önek ile

$scope.$on('$routeChangeSuccess', function (current,previous) { 

    $scope.chunka = $route.current.params.chunka; 
    $scope.chunkb = $route.current.params.chunkb; 

    /** do my stuff with chunka and chunkb **/ 
}); 
0

Sana Açısal bu gibi tüm yolları yönetmesine izin gerektiğini düşünüyorum:

var app = angular.module('app', []).config(function($routeProvider, $locationProvider) { 
$locationProvider.html5Mode(true).hashPrefix('!'); 

$routeProvider 
    .when('/', 
    { 
     controller: 'HomeController', 
     templateUrl: '/partials/home.html' 
    }) 
    .when('/about', 
    { 
     controller: 'AboutController', 
     templateUrl: '/partials/about.html' 
    }) 
    .when('/privacy', 
    { 
     controller: 'PrivacyController', 
     templateUrl: '/partials/privacy.html' 
    }) 
    .when('/404', 
    { 
     controller: 'NotFoundController', 
     templateUrl: '/partials/404.html', 
    }) 
    .otherwise({ 
     redirectTo: '/404' 
    }); 
}); 

Bildirimi aksi yukarıda. Bu, bir yol tanınmazsa 404 sayfasını yüklemek için açısal olarak söyler.

İlgili konular