在AngularJS中,如何在URL哈希上添加$ watch?

时间:2014-02-25 01:23:27

标签: javascript angularjs

使用Angular,如何通过我的应用程序或浏览器从URL栏或后退/前进按钮更新URL时,如何添加更新哈希时触发的监视?

4 个答案:

答案 0 :(得分:25)

$scope.$watch接受函数作为第一个参数,所以你可以这样做:

$scope.$watch(function () {
    return location.hash
}, function (value) {
    // do stuff
});

但我建议使用using events,例如$routeChangeSuccess default router

$scope.$on("$routeChangeSuccess", function () {})
对于ui-router

$stateChangeSuccess

$scope.$on("$stateChangeSuccess", function () {})

答案 1 :(得分:17)

$locationChangeSuccess可能会更好。

implicit val uploadContext: ExecutionContext = Akka.system.dispatchers.lookup("upload-context")

def upload = Action.async(parse.multipartFormData) { implicit request =>
  request.body.file("picture").map { picture =>
    val client = new AmazonS3Client
    Future(client.putObject("my-bucket", picture.filename, picture.ref.file))(uploadContext)
  }.getOrElse {
    Future.successful(BadRequest("File missing"))
  }
}

答案 2 :(得分:7)

如果没有使用角度$ watch,你也可以。 基本上,您观看'hashchange' windows事件。无论angularJS做什么都是这个的包装。例如,

$($window).bind('hashchange', function () {

    // Do what you need to do here like... getting imageId from #
    var currentImageId = $location.search().imageId;

});

答案 3 :(得分:1)

location.hash可以通过角度或内部由用户或浏览器进行内部更新(单击书签中的链接)。如果它在内部更新,则会运行$ scope。$ apply()。如果外部事件更新location.hash $ watch只会在下一个$ scope之后触发UNTIL。$ apply(),例如用户按下您应用中的按钮。

如果您希望使用$ watch,请向“hashchange”添加一个额外的事件侦听器以调用$ apply,或者将所有功能添加到本机DOM侦听器中,并且不要忘记调用$ apply(),因为这是一个外部电话。

window.addEventListener("hashchange", function(){ $scope.$apply(); }, false);

或......

window.addEventListener("hashchange", function(){ me._locationHashChanged(); $scope.$apply(); }, false);