$位置更改不会传播

时间:2017-07-12 22:31:03

标签: angularjs

我有一个控制器videoCtrl如下:

app.controller('videoCtrl',function($scope,$location){

$scope.location = $location.path();

}); 并在HTML中我有:

   <div style="position: relative" ng-controller="videoCtrl">
        <p>{{location}}</p>
</div>   

当我从名为'/ parts'的路径开始时,它正确地显示了部分。但是当我改变'/ established'的路径时,改变将不会生效,它仍然是'/ parts'。这是正常的吗?

2 个答案:

答案 0 :(得分:2)

可以通过几种不同的方式解决此问题。

问题的根源是$location.path()是一个函数,它返回一个字符串,表示调用函数时的值。不幸的是,当控制器首次初始化时,此功能仅被称为一次。这似乎表示您正在为多个路径使用相同的控制器。

按效率顺序解决问题的可能方法包括:

  1. 为每条路径使用唯一的控制器(这可以通过角度ngRoute或第三方ui路由器等路由器自动完成)。当初始化该路径的控制器时,该函数将运行,该值将是正确的当前路径。
  2. 使用像

    这样的观察者
    $rootScope.on('$locationChangeSuccess', function () {
      $scope.location = $location.path();
    });
    

    只要成功更改位置,此观察程序就会被触发,并会相应地更新您的值。

  3. 使用HTML中绑定的函数

    <p>{{getLocation()}}</p>
    
    $scope.getLocation = $location.path;
    

    这将隐式创建一个观察程序,它将触发$location.path()函数$digest个周期

答案 1 :(得分:1)

您在控制器中设置的位置仅设置一次。如果您希望角度不断观看位置,您需要通过以下函数将其添加到您的html中。

而不是让你的HTML看起来像:

<p>{{location}}</p>

控制器中包含以下js:

$scope.location = $location.path();

试试html:

<p>{{getLocation()}}</p>

和js:

$scope.getLocation = $location.path;

通过评估注入到html中的表达式中的函数,AngularJS将设置一些内容,它们将观察$ scope.getLocation()返回的值,并分别更新DOM。