【问题标题】:How to access Angular service in a view expression?如何在视图表达式中访问 Angular 服务?
【发布时间】:2015-02-19 19:18:40
【问题描述】:

Angular 文档建议使用 Angular 服务 Angular 表达式:

改为在从表达式调用的函数中使用 $window 和 $location 等服务。此类服务提供对全局变量的可模拟访问。

– https://docs.angularjs.org/guide/expression#context

但是,默认情况下,这些服务似乎不在视图范围内,例如

{{$location || 'Undefined'}}

将产生“未定义”。

如果我想从一个视图访问$location服务,我需要将它注入到作用域中吗?

/* some controller */ function ($scope, $location) {
    $scope.$location = $location;
}

【问题讨论】:

  • 是的。通过 $scope 向视图公开方法和属性。虽然有点反模式,因为您将视图与 $location 紧密耦合。你应该抽象成一个方法,或者更好的是,一个指令。
  • 这是一个“出于好奇”而不是实际的问题。该文档在这方面有点误导。这意味着 $window 服务在表达式上下文中可用。
  • 不确定是不是...但无论哪种方式,要“坚持” Angular 中的可测试模式,您可能应该使用对控制器的方法调用或指令来封装您的内容正在努力做。我会尝试回答..

标签: javascript angularjs


【解决方案1】:

这里最好的做法是将您尝试做的事情封装在控制器方法调用或指令中。因此,例如,如果您想将当前 URL 带到视图中,您可能应该执行以下操作。

查看

<p>{{ CurrentUrl }}</p>

控制器

(function(app){

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

        $scope.CurrentUrl = $location.$$path; // or whatever is most useful to display

    }]);

})(myApp);

这意味着您遵循 Angular 的 IOC 模式,而不是将“$location”紧密耦合到您的视图或控制器。

这里使用“$location”显然只是一个例子。你可以使用 "$window" 或任何你想要的。

【讨论】:

  • Gajus Kuizinas - 我已回滚您的编辑。因为它不是编辑,所以它是 OP 想要的你的版本 - 不是我的。如果你想回答这个问题,那就去做吧。
  • 是的,并且还可以防止暴露 $location var。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多