2013-12-17 24 views
14

我有一个观点,我有以下代码:

<input type="button" value="New Post" ng-click="$state.go('blog.new-post')"> 

我们的目标是在无需过渡到一个新的状态使用href。不幸的是,上面的代码不会触发。

我也试图包括控制器该视图$状态:

app.controller('blogPostsController', function($scope, $stateParams, $http, $state) ... 

但仍然一无所获。 transictionTo似乎也不起作用。

任何人有任何想法如何使这项工作?

编辑:我只能让它通过分配工作:

$scope.$state = $state; 

我的控制器内。这看起来很难看。真的没有其他的方式来访问$状态,而不分配给作用域?

回答

11

根据https://github.com/angular-ui/ui-router/wiki/Quick-Reference#note-about-using-state-within-a-template你可以,如果你正在使用ui-router其添加到$rootScope,所以它会在所有的范围内有效,因此所有的模板,通过

angular.module("myApp").run(function ($rootScope, $state, $stateParams) { 
    $rootScope.$state = $state; 
    $rootScope.$stateParams = $stateParams; 
}); 
+2

它通常被认为是不好的做法,这样的属性添加到$ rootScope。 – jkjustjoshing

+3

在你真的需要这样的情况下(这种情况并不需要它 - 请参阅我的答案),更好的选择是创建一个轻量指令,它接受一个属性值并$在依赖关系的上下文中解析它。 – jkjustjoshing

43

有一个名为ui-sref能够属性

<a ui-sref="blog.new-post"></a> 

我建议使用和造型的联系,一个按钮(如果您使用的是CSS库类似Twitter的引导很容易做到):可用于如下。那么在编写链接时,你不需要搞乱任何JavaScript。

如果你需要一个参数传递进入状态,你可以做到以下几点:

<a ui-sref="blog.edit-post({id: item.id})"></a> 

其中$ scope.item是要作为一个URL参数传递的ID属性的对象。

+2

认为这应该是被接受的答案..当然,你将无法通过这种方式将params传递给状态。 – RoyM

+3

@roymath,其实你可以!答案已被编辑。 – jkjustjoshing

+2

谢谢 - 这使它真的很好..我也意识到的一件事情是,您可以非常优雅地更改一部分url路径 - 即:本质上通过在状态内导航。 例如:你有一个类似于'S'的URL,如下所示:'/ foo /:aa /:bb /:cc' 如果你已经在'/ foo/joe/blow/rocks',而你想将'blow'改成'sixpack',但将其余的单独留下,这只是一个'ui-sref ='S({bb:'sixpack'})“ - 而不必担心关于其他参数。 如果您试图直接修改'$ location.path',则会更加困难 – RoyM

0

简单的解决方法是使用$窗口服务老方法

  1. 进样$窗口角JS的服务。
  2. 使用history.back() javascript的函数。
  3. 完成,如果你只想回去,这是最简单的解决方案。

我不会写整个角JS。只有事项代码:

HTML码

<button ng-click="$ctrl.goBack()">Go Back</button> 

JS-代码

self.goBack = function(){ $window.history.back(); };