Bir rotayı aramak için ng-click nasıl / ne zaman kullanılır?


243

Rota kullandığınızı varsayalım:

// bootstrap
myApp.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {

    $routeProvider.when('/home', {
        templateUrl: 'partials/home.html',
        controller: 'HomeCtrl'
    });
    $routeProvider.when('/about', {
        templateUrl: 'partials/about.html',
        controller: 'AboutCtrl'
    });
...

Html'nizde, bir düğme tıklandığında yaklaşık sayfasına gitmek istersiniz. Bunun bir yolu

<a href="#/about">

... ama ng-click burada da faydalı olabilir.

  1. Bu varsayım doğru mu? Çapa yerine bu ng-tıklama kullanılsın mı?
  2. Öyleyse, bu nasıl çalışır? IE:

<div ng-click="/about">



Yanıtlar:


430

Rotalar $locationhizmeti izler ve URL'deki değişikliklere yanıt verir (genellikle karma yoluyla). Bir rotayı "etkinleştirmek" için URL'yi değiştirmeniz yeterlidir. Bunu yapmanın en kolay yolu bağlantı etiketleri kullanmaktır.

<a href="#/home">Go Home</a>
<a href="#/about">Go to About</a>

Daha karmaşık bir şeye gerek yok. Bununla birlikte, bunu koddan yapmanız gerekiyorsa, doğru yol $locationhizmeti kullanmaktır :

$scope.go = function ( path ) {
  $location.path( path );
};

Örneğin, bir düğme tetikleyebilir:

<button ng-click="go('/home')"></button>

6
Bu benim için işe yaramadı, ama $ location.hash (hash) yerine; $ location.path (karma) ile; işe yarıyor. Bu, herhangi bir nedenle çok daha az oy alan başka bir cevapta @sean tarafından öneriliyor.
— Per Quested Aronsson

2
@PerQuestedAronsson pathve hashiki farklı amaca hizmet eder, ancak duruma bağlı olarak aynı etkiye sahip olabilir. Çoğu durumda, sıkı yönlendirme için (özellikle html5modeetkinken), pathkanonik seçim olacaktır. Cevabı bunu yansıtacak şekilde güncelledim.
— Josh David Miller

2
@DavidWoods Çalışmalıdır, ancak yalnızca temel yol eşleşirse /. Uygulamayı şuradan sunuyorsanız /app/index.html, mutlak URL olduğu için bu çalışmaz /app/next.html. Açıkçası, sunucu index.htmlisabet edildiğinde dosyanızı geri döndürecek şekilde ayarlanmalıdır /next.html. Bir göz atmamı istiyorsanız, bir Plunker / Fiddle yayınlamaktan çekinmeyin.
— Josh David Miller

2
Bu çok genel ve kullanışlı bir şey. Merkezileştirmenin bir yolu var mı, yoksa goher denetleyiciye gerçekten bir yöntem eklememiz gerekiyor mu? (Veya bir goyöntemle bir kök denetleyici oluşturmalı mısınız?)
— Bennett McElwee 25:03

3
@BennettMcElwee Bence en iyi yaklaşım sadece bağlantı etiketleri kullanmaktır; düğme etiketi bu durumda hiçbir değer sağlamaz ve sorunu yaratan şeydir. Yani, kolayca sizin için mesela bunu yapmak için bir yönerge oluşturabilir, şunları söyledi: <button click-go="/home">Click</button>. Bağlantı işlevi sadece şu olurdu:element.on("click", function () { $location.path(attrs.clickGo); });
— Josh David Miller

83

İşte kimsenin bahsetmediği harika bir ipucu. İşlevin dahil olduğu denetleyicide, konum sağlayıcısını eklemeniz gerekir:

app.controller('SlideController', ['$scope', '$location',function($scope, $location){ 
$scope.goNext = function (hash) { 
$location.path(hash);
 }

;]);

 <!--the code to call it from within the partial:---> <div ng-click='goNext("/page2")'>next page</div>

2
havalı teşekkürler! Bu yanıt benim için daha iyi çalıştı, çünkü hash yöntemi url (kodlanmış) değerlerini ekler ve yol yöntemi tam url'i değiştirmeme izin verir, bu da ihtiyacım olan şeydi. Teşekkürler!
— jfplataroti

8
Bu sayfada gerçekten işe yarayan tek çözüm budur. Neden başka bir cevabın bundan daha fazla oyu olduğunu bilmiyorum ..?
— Per Quested Aronsson

Bunu deniyordum, ama çalışmıyor. Denetleyiciye bağlamadan önce modüle de yer eklemem gerekir mi?
— Fallenreaper

<a> yerine bir div'a ng-click ayarladıktan sonra bu benim için çalıştı.
— Steve

33

Özel bir öznitelik kullanmak (bir yönergeyle uygulanır) belki de en temiz yoldur. İşte @Josh ve @ sean'ın önerilerine dayanan versiyonum.

angular.module('mymodule', [])

// Click to navigate
// similar to <a href="#/partial"> but hash is not required, 
// e.g. <div click-link="/partial">
.directive('clickLink', ['$location', function($location) {
    return {
        link: function(scope, element, attrs) {
            element.on('click', function() {
                scope.$apply(function() {
                    $location.path(attrs.clickLink);
                });
            });
        }
    }
}]);

Bazı yararlı özellikleri var, ancak Angular için yeniyim, bu yüzden muhtemelen iyileştirme için yer var.


Bu, clickLink özelliği her değiştiğinde öğe üzerinde bir tıklama etkinliği oluşturmaz mı?
— toxaq

@toxaq Kesinlikle mükemmel değil. clickLinkÖzellik değiştiğinde, direktifin yeni tıklama işleyicisini ekleyeceğini ancak eskisini yerinde bırakacağından şüpheleniyorum . Sonuç biraz kaotik olabilir. Aslında bunu, clickLinközelliğin asla değişmeyeceği bir durumda kullanmak için yazdım , bu yüzden bu gevşek ucu asla bağlayamadım. Bu hatayı düzeltmek aslında daha basit bir kod yol açacağını düşünüyorum
— Zamanım

Güzel. Evet, attrileri çıkarırsanız. $ Amaçlanan şekilde çalışacağını gözlemleyin. Sürümümü buraya yapıştırırdım, ancak yorumlarda biçimlendirilmeyecek ve gözlemlenen bölümün hemen hemen aynısı.
— toxaq

@toxaq Şimdi kodu düzenledim. Sanırım kodu başka bir yönergeden uyarlamıştım, bu yüzden uygunsuz attrs.$observeoradaydı. Önerileriniz için teşekkürler.
— Bennett McElwee

Önerilen cevapları okurken bunu önermek üzereydi. Temiz ve tekrar kullanılabilir. +1
— Dormouse

4

Yönlendirme için ng-click kullanırsanız, öğeyi sağ tıklayıp "yeni sekmede aç" veya bağlantıyı tıklayarak ctrl'yi seçemeyeceğinizi unutmayın. Navigasyon söz konusu olduğunda ng-href kullanmaya çalışıyorum. ng-click, işlemler veya daraltma gibi görsel efektler için düğmelerde kullanmak daha iyidir. Ama Hakkında tavsiye etmem. Rotayı değiştirirseniz, uygulamaya yerleştirilen bir çok yerde değiştirmeniz gerekebilir. Bağlantıyı döndüren bir yöntem var. ör .: Hakkında. Bir yardımcı programa yerleştirdiğiniz bu yöntem


1

ng-clickYönerge, route templateUrl isteğinde bulunurken, hangisinin <div>olması gerektiğini showveya hideroute templateUrl sayfası içinde veya farklı senaryolar için karar vermek amacıyla bir işlevi çağırmak için kullandım .

AngularJS 1.6.9

Yönlendirme sayfasında bir örnek görelim , üst denetleyici modelleri ve boolean kullanarak kontrol ettiğim eklenti <div>veya düzenlemeye ihtiyacım var .<div>$scope.addProduct$scope.editProduct

RoutingTesting.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Testing</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-route.min.js"></script>
    <script>
        var app = angular.module("MyApp", ["ngRoute"]);

        app.config(function($routeProvider){
            $routeProvider
                .when("/TestingPage", {
                    templateUrl: "TestingPage.html"
                });
        });

        app.controller("HomeController", function($scope, $location){

            $scope.init = function(){
                $scope.addProduct = false;
                $scope.editProduct = false;
            }

            $scope.productOperation = function(operationType, productId){
                $scope.addProduct = false;
                $scope.editProduct = false;

                if(operationType === "add"){
                    $scope.addProduct = true;
                    console.log("Add productOperation requested...");
                }else if(operationType === "edit"){
                    $scope.editProduct = true;
                    console.log("Edit productOperation requested : " + productId);
                }

                //*************** VERY IMPORTANT NOTE ***************
                //comment this $location.path("..."); line, when using <a> anchor tags,
                //only useful when <a> below given are commented, and using <input> controls
                $location.path("TestingPage");
            };

        });
    </script>
</head>
<body ng-app="MyApp" ng-controller="HomeController">

    <div ng-init="init()">

        <!-- Either use <a>anchor tag or input type=button -->

        <!--<a href="#!TestingPage" ng-click="productOperation('add', -1)">Add Product</a>-->
        <!--<br><br>-->
        <!--<a href="#!TestingPage" ng-click="productOperation('edit', 10)">Edit Product</a>-->

        <input type="button" ng-click="productOperation('add', -1)" value="Add Product"/>
        <br><br>
        <input type="button" ng-click="productOperation('edit', 10)" value="Edit Product"/>
        <pre>addProduct : {{addProduct}}</pre>
        <pre>editProduct : {{editProduct}}</pre>
        <ng-view></ng-view>

    </div>

</body>
</html>

TestingPage.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .productOperation{
            position:fixed;
            top: 50%;
            left: 50%;
            width:30em;
            height:18em;
            margin-left: -15em; /*set to a negative number 1/2 of your width*/
            margin-top: -9em; /*set to a negative number 1/2 of your height*/
            border: 1px solid #ccc;
            background: yellow;
        }
    </style>
</head>
<body>

<div class="productOperation" >

    <div ng-show="addProduct">
        <h2 >Add Product enabled</h2>
    </div>

    <div ng-show="editProduct">
        <h2>Edit Product enabled</h2>
    </div>

</div>

</body>
</html>

her iki sayfa - RoutingTesting.html(ebeveyn),TestingPage.html (yönlendirme sayfası) aynı dizinde,

Umarım bu birine yardımcı olur.



0

Kullanabilirsiniz:

<a ng-href="#/about">About</a>

Href içinde bazı dinamik değişkenler istiyorsanız şu şekilde yapabilirsiniz:

<a ng-href="{{link + 123}}">Link to 123</a>

Nerede bağlantı Açısal kapsamı değişkendir.


5
Bu, ng-clickkonumu değiştirmek için kullanmakla ilgili OP sorusuna cevap vermez .
— jjmontes

0

html yazınızda aşağıdaki gibi yapın:

<button ng-click="going()">goto</button>

Denetleyicinize $ state değerini aşağıdaki gibi ekleyin:

.controller('homeCTRL', function($scope, **$state**) {

$scope.going = function(){

$state.go('your route');

}

})
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.