$ State.go toParams ve $ stateParams kullanarak parametreler nasıl gönderilir ve alınır?


123

Ui-router v0.2.0 ile AngularJS v1.2.0-rc.2 kullanıyorum. Ben kullanmak yüzden başka bir devlete yönlendiren devlet geçmek istiyorum toParamsait $state.goşöyle:

$state.go('toState', {referer: $state.current.name});

Göre docs , bu doldurmak gerekir $stateParamsüzerinde toStatedenetleyici, ama öyle undefined. Neyi kaçırıyorum?

Göstermek için bir yığın yarattım:

http://plnkr.co/edit/ywEcG1

Yanıtlar:


147

URL olmayan durumu geçirmek istiyorsanız, o urlzaman state. Cevabı bir PR'da buldum ve daha iyi anlamak için etrafta biraz maymunluk yaptım.

$stateProvider.state('toState', {
  templateUrl:'wokka.html',
  controller:'stateController',
  params: {
    'referer': 'some default', 
    'param2': 'some default', 
    'etc': 'some default'
  }
});

Sonra da şu şekilde gezinebilirsiniz:

$state.go('toState', { 'referer':'jimbob', 'param2':37, 'etc':'bluebell' });

Veya:

var result = { referer:'jimbob', param2:37, etc:'bluebell' };
$state.go('toState', result);

Ve HTML'de şu şekilde:

<a ui-sref="toState(thingy)" class="list-group-item" ng-repeat="thingy in thingies">{{ thingy.referer }}</a>

Bu kullanım durumu belgelerde tamamen ortaya çıkarılmıştır, ancak bunun URL'leri kullanmadan geçiş durumu için güçlü bir araç olduğunu düşünüyorum.


2
NOT: (v0.2.10'da) Durum, URL parametresi olan bir ebeveynin alt durumuysa, bu parametrenin paramsdiziye dahil edilmesi gerekir .
ivarni

5
Parametreleri durum tanımında bir dizi olarak listelediğimde "Gerekli parametre eksik" diyen bir hata alıyordum. Bunun yerine, bunları bir hash gibi {referer: true, param2: true, etc: true}
listeleyin

1
Bu, en son v0.2.13 sürümünde benim için işe yaramadı. Belki de bir sebepten dolayı belgelenmemişti.
demisx

1
En son olarak, bir nesne olarak parametreleri değiştirmeniz gerekir. so params: {myParam: {value: defaultValue / undefined }}
rbnzdave

2
denetleyicideki verileri nasıl alabilirim?
Shylendra Madda

47

Nathan Matthews'in çözümü benim için işe yaramadı, ancak tamamen doğru, ancak geçici bir çözüme ulaşmanın çok az anlamı var:

Kilit nokta şudur: $ state.go'daki tanımlı parametrelerin türü ve toParamas, durum geçişinin her iki tarafında aynı dizi veya nesne olmalıdır.

Örneğin, bir durumda bir parametreyi aşağıdaki gibi tanımladığınızda, "[]" kullanılması nedeniyle parametrelerin dizi olduğu anlamına gelir:

$stateProvider
.state('home', {
    templateUrl: 'home',
    controller:  'homeController'
})
.state('view', {
    templateUrl: 'overview',
    params:      ['index', 'anotherKey'],
    controller:  'overviewController'
})

Öyleyse, Params'a şu şekilde bir dizi olarak da geçmelisiniz:

params = { 'index': 123, 'anotherKey': 'This is a test' }
paramsArr = (val for key, val of params)
$state.go('view', paramsArr)

Ve bunlara $ stateParams aracılığıyla aşağıdaki gibi bir dizi olarak erişebilirsiniz:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams[0];
    var anotherKey = $stateParams[1];
});

Daha iyi çözüm, her iki tarafta dizi yerine nesne kullanmaktır :

$stateProvider
.state('home', {
    templateUrl: 'home',
    controller:  'homeController'
})
.state('view', {
    templateUrl: 'overview',
    params:      {'index': null, 'anotherKey': null},
    controller:  'overviewController'
})

Params tanımında [] 'yı {} ile değiştirdim. ToParams'ı $ state.go'ya iletmek için ayrıca array yerine object kullanmalısınız:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })

daha sonra bunlara $ stateParams aracılığıyla kolayca erişebilirsiniz:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams.index;
    var anotherKey = $stateParams.anotherKey;
});

Kesinlikle işe yarıyor ve bunu projemde kullandım. Test ettin mi Test ederseniz, sorunu bana bildirin.
Rıza Rahimi

1
bu bir nesne biçimi değil {'dizin', 'anotherKey'} bu nasıl çalışır? Ben denedim. İşe yaramadı.
maxisam

Kod pasajınızı, sürümü veya sorunu çözmeye yardımcı olabilecek bir şey koyun. Şu sürümleri kullandım: AngularJS v1.2.26, ui-router v0.2.11, CoffeeScript ayrıca bower'ın versiyonlarını da kullandım.
Reza Rahimi

3
Bu eserler, ancak yerine params: {'index', 'anotherKey'},sahip params: {'index' : 'dummy', 'anotherKey' : 'dummy'},aksi takdirde geçerli bir JavaScript nesne değil
ps0604

28

Tek yapmam gereken url durum tanımına böyle bir parametre eklemekti

url: '/toState?referer'

Doh!


Bunun /toState/:referersözdizimi ile çalışmasını sağlamanın tek yolu $location.path()yerine kullanmaktır $state.go().
nshew

UI yönlendiricinin işlevselliğini kullanan başka bir çözüm bulamadınız mı?
Jason

bunun $ state.go () ile çalışmasını sağlamanın bir yolu var. Doğru yapmam biraz zaman aldı. Buradaki örneğime bakın.
mbokil

İşe yaradı. Ancak, iki parametreyi geçirmek isteyip istemediğiniz açık olmayabilir; bu yüzden aşağıdaki satır hile yapar. url: "/ kişiler? myParam1 & myParam2"
eduardo92

15

Ui-router v0.2.0 ile AngularJS v1.2.0-rc.2 ile çalışıp çalışmayacağından emin değilim. Bu çözümü ui-router v0.2.13 ile AngularJS v1.3.14 üzerinde test ettim.

Gwhn'in önerdiği gibi URL'deki parametreyi geçirmek için gerekli olmadığını anlıyorum.

Parametrelerinizi, durum tanımınıza varsayılan bir değerle eklemeniz yeterlidir. Durumunuz hala bir URL değerine sahip olabilir.

$stateProvider.state('state1', {
    url : '/url',
    templateUrl : "new.html",
    controller : 'TestController',
    params: {new_param: null}
});

ve parametreyi ekle $state.go()

$state.go('state1',{new_param: "Going places!"});


Coll ... Günümdeki adamlarımı kurtardınız! Basit ve doğrudan çözüm.
Nowdeen

15

Bu sayfadaki bu örneklerin hiçbiri benim için işe yaramadı. Kullandığım şey buydu ve iyi çalıştı. Bazı çözümler url'yi $ state.go () ile birleştiremeyeceğinizi söyledi, ancak bu doğru değil. Garip olan şey, url için parametreleri tanımlamanız ve ayrıca parametreleri listelemenizdir. İkisi de mevcut olmalıdır. Angular 1.4.8 ve UI Router 0.2.15'te test edilmiştir.

Gelen devlet devletin sonuna kadar params ekleyebilir ve params tanımlayın:

url: 'view?index&anotherKey',
params: {'index': null, 'anotherKey': null}

Senin içinde denetleyici sizin go deyimi aşağıdaki gibi görünecektir:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' });

Ardından parametreleri çıkarmak ve bunları yeni eyaletinizin denetleyicisinde kullanmak için (denetleyici işlevinize $ stateParams'ı geçirmeyi unutmayın):

var index = $stateParams.index;
var anotherKey = $stateParams.anotherKey;
console.log(anotherKey); //it works!

11

Benim durumumda burada verilen tüm seçenekleri denedim, ancak hiç kimse düzgün çalışmıyordu (açısal 1.3.13, ionic 1.0.0, açısal-ui-yönlendirici 0.2.13). Çözüm şuydu:

.state('tab.friends', {
      url: '/friends/:param1/:param2',
      views: {
        'tab-friends': {
          templateUrl: 'templates/tab-friends.html',
          controller: 'FriendsCtrl'
        }
      }
    })

ve state.go içinde:

$state.go('tab.friends', {param1 : val1, param2 : val2});

Şerefe


Bu benim için iyi çalıştı, denetleyicinin parametrenin aynı ada sahip olması koşuluyla, örneğin $ stateParams.param1.
nuander

yes @nuander, bu değişkene nasıl erişeceğimi söylemeyi unuttum, bunun için teşekkürler!
Cris R

8

Ionic / Angular'ın $ state & $ stateParams; ile savaşarak epey zaman harcadım;

$ State.go () ve $ stateParams'ı kullanmak için belirli ayarlara sahip olmanız ve diğer parametrelerin mevcut olmaması gerekir.

App.config () dosyama $ stateProvider ekledim ve içinde birkaç durum tanımladım:

$stateProvider
    .state('home', {
        templateUrl: 'home',
        controller:  'homeController'
    })
    .state('view', {
        templateUrl: 'overview',
        params:      ['index', 'anotherKey'],
        controller:  'overviewController'
    })

paramsAnahtar özellikle önemlidir. Ayrıca, urlstateParams kullanan HİÇBİR anahtar olmadığına dikkat edin ve URL'ler karışmaz. Birbirlerine karşılıklı olarak özeldirler.

$ State.go () çağrısında şu şekilde tanımlayın:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })

indexVe anotherKeyilk $ stateController listelenen eğer $ stateParams değişkenler SADECE doldurulur paramstanımlayan anahtarın.

Denetleyiciye, gösterildiği gibi $ stateParams ekleyin:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams.index;
    var anotherKey = $stateParams.anotherKey;
});

Aktarılan değişkenler mevcut olmalıdır!


Değer bir JSON nesnesi olabilir mi? $ State.go ('view', {'editObj': {val1: 2, val2: 3, val4: 'Merhaba'}}) gibi. Çünkü bu benim için çalışmıyor.
PavanSandeep

6

Denemek reload: truemi?

En uzun süre neler olduğunu anlayamadım - kendimi kandırdığım ortaya çıktı. Bir şeylerin doğru yazıldığından eminseniz ve aynı durumu kullanacaksanız, şunu deneyin reload: true:

.state('status.item', {
    url: '/:id',
    views: {...}
}

$state.go('status.item', { id: $scope.id }, { reload: true });

Umarım bu size zaman kazandırır!


5

Ben de benzer bir sorunla karşılaştım. Çok sayıda googling ve deneme ve testten sonra çalışan bir çözüm buldum. İşte sizin için işe yarayacak çözümüm.

İki denetleyicim var - searchBoxController ve stateResultController ve bir arama kutusu olan bir görünümden uzak bir sunucudan getirilen sonuçları gösteren bir görünüme geçirilecek searchQuery adlı bir parametre . Bunu nasıl yapıyorsun:

Aşağıda, bir sonraki görünümü kullanarak çağırdığınız denetleyici bulunmaktadır. $state.go()

.controller('searchBoxController', function ($scope, $state) {
        $scope.doSearch = function(){
            var searchInputRaw = $scope.searchQueryInput;
            $state.go('app.searchResults', { searchQuery: searchInput });
        }
    })

Çalıştırıldığında çağrılacak durum aşağıdadır $state.go():

.state('app.searchResults', 
            {
                url: '/searchResults',
                views:
                {
                    'menuContent': { templateUrl: 'templates/searchResult.html', controller: 'stateResultController' }
                },
                params: 
                {
                    'searchQuery': ''
                }
            })

Ve son olarak, durumla ilişkilendirilen denetleyici app.searchResults:

.controller('stateResultController', function ($scope, $state, $stateParams, $http) {
        $scope.searchQueryInput = $stateParams.searchQuery;
    });

1
Bu benim için çalıştı ve tam da ihtiyacım olan şeydi, çünkü URL'deki paramı geçirmek istemiyordum, ancak durum bildiriminde url özelliğine ihtiyacım vardı.
Ernani

3

Ve benim ebeveyn / çocuk durumumda. alt durumda bildirilen tüm parametreler, üst durum tarafından bilinmelidir

        .state('full', {
            url: '/full',
            templateUrl: 'js/content/templates/FullReadView.html',
            params: { opmlFeed:null, source:null },
            controller: 'FullReadCtrl'
        })
        .state('full.readFeed', {
            url: '/readFeed',
            views: {
                'full': {
                    templateUrl: 'js/content/templates/ReadFeedView.html',
                    params: { opmlFeed:null, source:null },
                    controller: 'ReadFeedCtrl'
                }
            }
        })

2

2 parametre alan bir duruma geldiğimiz çözüm değişiyordu:

.state('somestate', {
  url: '/somestate',
  views: {...}
}

için

.state('somestate', {
  url: '/somestate?id=:&sub=:',
  views: {...}
}

1

Router.js'de aşağıdakileri tanımlayın

$stateProvider.state('users', {
    url: '/users',
    controller: 'UsersCtrl',
    params: {
        obj: null
    }
})

Denetleyicinizin $ stateParams eklemesi gerekiyor.

function UserCtrl($stateParams) {
    console.log($stateParams);
}

Aşağıdaki gibi parametreye göre bir nesne gönderebilirsiniz.

$state.go('users', {obj:yourObj});

1

Sayfa 1'den 2'ye gitmeye çalışıyordum ve bazı verileri de iletmem gerekiyordu.

Benim içinde router.js , ben parametreler eklendi adını ve yaşını :

.state('page2', {
          url: '/vehicle/:source',
          params: {name: null, age: null},
.................

In Sayfa1 , sonraki düğmesinin onClick:

$state.go("page2", {name: 'Ron', age: '20'});

In Sayfa2'ye , ben bu params erişebilecek:

$stateParams.name
$stateParams.age

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.