AngularJS ng-click um zu einer anderen Seite zu gehen (mit Ionic Framework)

Lesezeit: 7 Minuten

Benutzer-Avatar
Denker

Wenn ich auf die Schaltfläche klicke (die sich oben in der Ionic-Navigationsleiste befindet), sollte ich idealerweise zu einer anderen Seite gelangen. Es funktioniert jedoch nicht. Beim Klicken verschwinden alle Schaltflächen der Navigationsleiste.

Wenn ich Dummy-Codes verwendet habe, funktioniert es; die Warnung erscheint. Aber wenn ich es in den eigentlichen Code tausche, funktioniert es nicht.

Ich habe das Gefühl, dass etwas mit den Controller-Codes und wie auf die URL oder Ansicht verwiesen wird, nicht stimmt. Aber auch das Testen mit href und ui-sref bringt nichts. Google Devt Tools (JS-Konsole) und Batarang zeigen ebenfalls nichts an.

Könnte mir bitte jemand den Weg zeigen?

Dummy-HTML-Code

<button class="button button-icon ion-compose" ng-click="create()"></button>

Dummy-Controller-Code in der js-Datei

$scope.create = function() {
  alert("working");
};

tatsächlicher HTML-Code (ich habe alle 4 Versionen ausprobiert)

<button class="button button-icon ion-compose" ng-click="create('tab.newpost')"></button>
<button class="button button-icon ion-compose" ui-sref="tab.newpost"></button>
<button class="button button-icon ion-compose" href="https://stackoverflow.com/tab/newpost"></button>
<button class="button button-icon ion-compose" ng-click="location.path("https://stackoverflow.com/tab/newpost")"></button>

Die Controller-Datei (die Post- und Auth-Abhängigkeiten funktionieren einwandfrei). Wenn ich versuche, die URL sowohl in .go() als auch in function() einzufügen, schlägt die App fehl.

app.controller('NavCtrl', function ($scope, $location, $state, Post, Auth) {
    $scope.post = {url: 'http://', title: ''};

    $scope.create = function() {
      /* $location.path("https://stackoverflow.com/tab/newpost"); */   /* this variant doesnt work */
      $state.go("https://stackoverflow.com/tab/newpost"); 
    };
  });

Auszüge aus der State-js-Datei

.state('tab.newpost', {
      url: '/newpost',
      views: {
        'tab-newpost':{
          templateUrl: 'templates/tab-newpost.html',
          controller: 'NewCtrl'
        }
      }
    });

$urlRouterProvider.otherwise('/auth/login');

  • Versuchen Sie, die neu zu laden ganz Seite? Oder navigieren Sie einfach zu diesem Tab?

    – manosim

    23. August 2014 um 17:05 Uhr

  • Die App hat eine Navigationsleiste oben und eine untere Leiste. Die untere Leiste wird durch den Zustand „Tab“ dargestellt. Beim Klicken sollte es zur neuen Seite navigieren, während die Navigationsleiste und die untere Leiste bestehen bleiben.

    – Denker

    23. August 2014 um 17:08 Uhr

  • Wenn Sie uns eine zur Verfügung stellen können Codestift Link, dann wird es einfacher sein, Ihnen zu helfen.

    – manosim

    23. August 2014 um 17:19 Uhr

  • Nur um sicherzugehen, hast du meine Antwort überprüft? Ihr Problem kommt von ui-router, der Teil des ionischen Frameworks ist. Das $state.go muss richtig aufgerufen werden – mit einem Zustandsnamen, nicht mit der URL … hoffe, das hilft ein bisschen 😉

    – Radim Köhler

    23. August 2014 um 17:21 Uhr

  • @RadimKöhler Ich habe die Methoden $state.go und $window ausprobiert und beide hatten einen Cannot GET /tab/newpost-Fehler (wenn der HTML-Code einen ng-click=create() anstelle von ng-click(“tab.newpost”) hat Ich denke, es funktioniert einigermaßen.Wenn Sie $state.go verwenden, bin ich mir nicht sicher, wie ich es sonst zum Laufen bringen soll.Codepen funktioniert hier schlecht, da ich verschiedene Codes habe, die sich auf die Datenbank und andere Elemente beziehen, die ich nicht einfügen kann.

    – Denker

    23. August 2014 um 17:27 Uhr


Benutzer-Avatar
Radim Köhler

Basierend auf Kommentaren und aufgrund der Tatsache, dass @Thinkerer (das OP – Originalplakat) Ich habe einen Plunker für diesen Fall erstellt und beschlossen, eine weitere Antwort mit weiteren Details anzuhängen.

Die erste und wichtige Änderung:

// instead of this
$urlRouterProvider.otherwise('/tab/post');

// we have to use this
$urlRouterProvider.otherwise('/tab/posts');

weil die Zustandsdefinition lautet:

.state('tab', {
  url: "/tab",
  abstract: true,
  templateUrl: 'tabs.html'
})

.state('tab.posts', {
  url: '/posts',
  views: {
    'tab-posts': {
      templateUrl: 'tab-posts.html',
      controller: 'PostsCtrl'
    }
  }
})

und wir brauchen ihre verkettete URL '/tab' + '/posts'. Das ist die URL, die wir als verwenden möchten Andernfalls

Der Rest der Anwendung kommt dem Ergebnis sehr nahe, das wir brauchen …
ZB müssen wir den Inhalt immer noch in dieselbe Ansicht targetgood platzieren, nur diese wurden geändert:

.state('tab.newpost', {
  url: '/newpost',
  views: {
    // 'tab-newpost': {
    'tab-posts': {
      templateUrl: 'tab-newpost.html',
      controller: 'NavCtrl'
    }
  }

Weil .state('tab.newpost' wäre ersetzen das .state('tab.posts' wir müssen es im gleichen Anker platzieren:

<ion-nav-view name="tab-posts"></ion-nav-view>  

Abschließend noch einige Anpassungen in den Controllern:

$scope.create = function() {
    $state.go('tab.newpost');
};
$scope.close = function() { 
     $state.go('tab.posts'); 
};

Wie ich bereits in meinen vorherigen Antworten und Kommentaren sagte … das $state.go() ist der einzig richtige Weg, wie man es benutzt ionic oder ui-router

Überprüfen Sie das alles hier
Letzte Anmerkung – Ich habe nur die Navigation zwischen ausgeführt tab.poststab.newpost… der Rest wäre ähnlich

  • Danke vielmals! In der Tat, um Ihren Änderungen zu folgen und sowohl tab.posts als auch tab.newpost zu platzieren, um dieselbe Ansicht zu haben, und das Ganze funktioniert! Können Sie erklären, warum? Und wo soll ich die -Änderungen einfügen?

    – Denker

    24. August 2014 um 15:04 Uhr


  • Diese Lösung ist eine von vielen. Wir können es so machen, wie wir es getan haben, wenn Neu sollte sein ersetzen das Beiträge. Wir können aber auch zwei Bereiche mit unterschiedlichen Ansichtsnamen/Zielen erstellen (Geschwisteransichten). Oder wir können die verschieben Neu unter dem Beiträgeund dann nehmen wir an, ganz oben auf der Liste könnte ein Bereich stehen, in dem wir neue erstellen … während wir immer noch auf Beiträgen sind (tabs.posts.new)… und viele andere. Ich würde dringend empfehlen, hierher zu gehen: stackoverflow.com/a/20581135/1679310 und alle Links zu besuchen, die ich dort meistens erwähnt habe state.js. Bitte … das wird Ihnen sehr helfen, die wahre Kraft von zu erkennen ui-router. Genieß es 😉

    – Radim Köhler

    24. August 2014 um 15:09 Uhr


  • Der Übergang funktioniert, aber eine kurze Frage. Die Submit-Schaltfläche habe ich in ng-click=”submitPost()” geändert. Wenn ich auf „Senden“ klicke, komme ich zu meiner Anmeldeseite, aber der neue Beitragseintrag war fertig. Irgendeine Idee warum? Ich denke, es ist der URL-Router für sonst. Kann ich sagen, wenn Sie angemeldet sind, gehen Sie beim Senden zur Seite mit den Beiträgen?

    – Denker

    24. August 2014 um 15:25 Uhr


  • Wenn Sie nach dem Absenden zum Zustand tab.view wechseln möchten, müssen Sie es so aufrufen $state.go('tab.view', {postId: postId})… das ist es. Aber bitte langsamer. Bitte lesen Sie meine Links. Das wird helfen. und auch das: stackoverflow.com/a/21097886/1679310

    – Radim Köhler

    24. August 2014 um 15:34 Uhr

Verwenden <a> mit href statt a <button> löst mein Problem.

<ion-nav-buttons side="secondary">
  <a class="button icon-right ion-plus-round" href="#/app/gosomewhere"></a>
</ion-nav-buttons>

  • Genau das, was ich gesucht habe, danke. Auch für alle, die sich fragen <button> und <a> wird gleich aussehen, solange Sie die ionischen Klassen verwenden.

    – alexkb

    2. Juli 2015 um 5:08 Uhr


Benutzer-Avatar
Radim Köhler

Ein Gedanke, den Sie ändern sollten, ist der Anruf $state.go(). Wie hier beschrieben:

Der übergebene Parameter sollte der Zustandsname sein

$scope.create = function() {
  // instead of this
  //$state.go("/tab/newpost"); 

  // we should use this
  $state.go("tab.newpost"); 
};

Einige zitieren aus doc (der erste Parameter zu des [$state.go(to \[, toParams\] \[, options\]):

zu

Zeichenfolge Absoluter Zustandsname oder relativer Zustandspfad

Der Name des Zustands, in den gewechselt wird, oder ein relativer Zustandspfad. Beginnt der Pfad mit ^ oder . dann ist es relativ, sonst ist es absolut.

Einige Beispiele:

$state.go('contact.detail') will go to the 'contact.detail' state
$state.go('^') will go to a parent state.
$state.go('^.sibling') will go to a sibling state.
$state.go('.child.grandchild') will go to a grandchild state.

Benutzer-Avatar
Giannis Paraskevopoulos

app.controller('NavCtrl', function ($scope, $location, $state, $window, Post, Auth) {
    $scope.post = {url: 'http://', title: ''};

    $scope.createVariable = function(url) {
      $window.location.href = url;
    };
    $scope.createFixed = function() {
      $window.location.href="https://stackoverflow.com/tab/newpost";
    };
});

HTML

<button class="button button-icon ion-compose" ng-click="createFixed()"></button>
<button class="button button-icon ion-compose" ng-click="createVariable("https://stackoverflow.com/tab/newpost")"></button>

Wenn Sie einfach zu einer anderen Seite wechseln möchten, benötigen Sie möglicherweise einen Link, der wie eine Schaltfläche mit einem href wie dem folgenden aussieht:

<a href="/#/somepage.html" class="button">Back to Listings</a>

Hoffe das hilft.

1241440cookie-checkAngularJS ng-click um zu einer anderen Seite zu gehen (mit Ionic Framework)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy