AngularJS ng-click 转到另一个页面(使用 Ionic 框架)

Posted

技术标签:

【中文标题】AngularJS ng-click 转到另一个页面(使用 Ionic 框架)【英文标题】:AngularJS ng-click to go to another page (with Ionic framework) 【发布时间】:2014-10-17 07:52:48 【问题描述】:

理想情况下,当我单击按钮(位于顶部的 Ionic 导航栏中)时,它应该将我带到另一个页面。但是它不起作用。单击后,导航栏按钮全部消失。

当我使用虚拟代码时,它可以工作;出现警报。 但是当我把它换成实际的代码时,它就无法工作了。

我感觉控制器代码以及 URL 或视图的引用方式有些问题。但是使用 href 和 ui-sref 进行测试也无法产生任何结果。 Google Devt Tools(JS 控制台)和 Batarang 也没有显示任何内容。

谁能给我指路?

虚拟 html 代码

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

js 文件中的虚拟控制器代码

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

实际的 html 代码(我尝试了所有 4 个版本)

<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="/tab/newpost"></button>
<button class="button button-icon ion-compose" ng-click="location.path('/tab/newpost')"></button>

控制器文件(Post 和 Auth 依赖项工作正常)。当我尝试将 URL 同时放入 .go() 和 function() 中时,应用程序失败。

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

    $scope.create = function() 
      /* $location.path('/tab/newpost'); */   /* this variant doesnt work */
      $state.go("/tab/newpost"); 
    ;
  );

状态js文件摘录

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

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

【问题讨论】:

您是否要重新加载整个页面?还是直接导航到那个标签? 该应用在顶部和底部都有一个导航栏。底部栏由状态“选项卡”表示。单击时,它应该导航到新页面,而导航栏和底部栏保持不变。 如果您可以提供给我们codepen 链接,那么我们会更容易为您提供帮助。 只是为了确定,你检查我的答案了吗?您的问题来自 ui-router,它是 ionic 框架的一部分。必须正确调用 $state.go - 使用州名,而不是网址...希望这会有所帮助;) @RadimKöhler 我尝试了 $state.go 和 $window 方法,但都有一个 Cannot GET /tab/newpost 错误(当 html 有一个 ng-click=create() 而不是 ng-click (“tab.newpost”)我猜这意味着它有点工作。如果使用 $state.go,我不知道如何使它工作。Codepen 在这里工作很差,因为我有各种与数据库和其他项目相关的代码我无法插入。 【参考方案1】:

基于 cmets,并且由于 @Thinkerer (OP - 原始海报)为此案例创建了一个 plunker,我决定附加另一个包含更多详细信息的答案。

这是由@Thinkerer创建的plunker 这是它的updated and working version

第一个也是重要的变化:

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

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

因为状态定义是:

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

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

我们需要他们的连接网址'/tab' + '/posts'。这就是我们想要用作 otherwise

的 url

应用程序的其余部分确实接近我们需要的结果... 例如。我们仍然必须将内容放到同一个视图 targetgood,只是这些被改变了:

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

因为.state('tab.newpost'替换 .state('tab.posts' 我们必须将其放置在同一个锚点中:

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

最后对控制器进行一些调整:

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

正如我在之前的回答和 cmets 中已经说过的那样 ... $state.go() 是使用ionicui-router 的唯一正确方法

检查所有here 最后一点 - 我只在 tab.posts...tab.newpost... 之间运行导航... 其余部分类似

【讨论】:

非常感谢!事实上,按照您的更改并将 tab.posts 和 tab.newpost 都放在相同的视图上,整个事情就可以工作了!你能解释一下为什么吗?另外我应该在哪里插入 更改? 此解决方案是众多解决方案之一。如果 new 应该replace posts,我们可以像以前那样做。但是我们也可以创建两个具有不同视图名称/目标的区域(兄弟视图)。或者我们可以将 new 移动到 posts 下,然后假设列表顶部可能是我们创建新的区域......同时仍在帖子上(@ 987654340@)...等等。我强烈建议去这里:***.com/a/20581135/1679310 并访问我提到的所有链接,主要是 state.js。请...这将帮助您了解ui-router 的真正力量。享受它;) 过渡有效,但问题很简单。我将提交按钮更改为 ng-click="submitPost()"。单击提交时,它会将我带到我的登录页面,但新的帖子条目已完成。知道为什么吗?我认为它是 url 路由器,否则。有什么办法可以说,如果登录,然后在提交时,转到帖子页面? 如果你想在提交后进入状态tab.view,你必须这样称呼它$state.go('tab.view', postId: postId)...就是这样。但是,请慢点。请阅读我的链接..这将有所帮助。还有这个:***.com/a/21097886/1679310【参考方案2】:

使用 &lt;a&gt; 和 href 而不是 &lt;button&gt; 可以解决我的问题。

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

【讨论】:

正是我想要的形式,谢谢。对于任何想知道&lt;button&gt;&lt;a&gt; 的人来说,只要您使用离子类,它们看起来就会一样。【参考方案3】:

一个认为你应该改变的是电话$state.go()。如此处所述:

$state.go(to [, toParams] [, options])

传递的参数应该是州名

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

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

一些引用自doc([$state.go(to \[, toParams\] \[, options\]的第一个参数to):

字符串绝对状态名称或相对状态路径

将转换到的状态的名称或相对状态路径。如果路径以 ^ 或 .那么它是相对的,否则它是绝对的。

一些例子:

$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.

【讨论】:

【参考方案4】:
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 = '/tab/newpost';
    ;
);

HTML

<button class="button button-icon ion-compose" ng-click="createFixed()"></button>
<button class="button button-icon ion-compose" ng-click="createVariable('/tab/newpost')"></button>

【讨论】:

在哪里以及如何插入代码?我是否也必须为 $window 注入依赖项? html 会怎样?应该还是 ng-click="create('/tab/newpost')" 吗?还是一个href? 这取决于您希望它是变量还是固定。 对不起,我对此很陌生。你能花点时间给我看两个不同的版本吗?无需详细解释,我可以先尝试阅读理解 这是否意味着控制器的变量代码...对于 url 我只需键入 url 或任何其他词?或者它是否意味着我希望导航到的实际网址?【参考方案5】:

如果您只是想转到另一个页面,那么您可能需要一个看起来像带有 href 的按钮的链接:

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

希望这会有所帮助。

【讨论】:

以上是关于AngularJS ng-click 转到另一个页面(使用 Ionic 框架)的主要内容,如果未能解决你的问题,请参考以下文章

angular跳转页面和传递参数

ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据

如何在 SwiftUI 中从一个详情页跳转到另一个详情页并返回列表页?

AngularJS:ng-click 是“一个好习惯”吗?为啥AngularJS中没有ng-event?

ng-click 不工作 AngularJS 和 dataTables

ng-click中的三元表达式在angularjs中