以下是我的意思的示例实现: http://plnkr.co/edit/iwQPZfbDyKYwSzjjAPTN?p=preview
单向绑定:
还有另一种方式:
最相关的代码部分(StackOverflow要求我包含一个):
.factory('syncUrlWithScope', function ($location) {
return function ($scope, defaultValues) {
$scope.$watch(function () {
return $location.search()
}, function (newVal) {
console.log(JSON.stringify(defaultValues), 'from url to scope', newVal)
$scope.queryParams = newVal
}, true)
$scope.$watch('queryParams', function (newVal) {
console.log(JSON.stringify(defaultValues), 'from scope to url', newVal, defaultValues)
for (var key in defaultValues) if (defaultValues.hasOwnProperty(key)) {
$scope.queryParams[key] = $scope.queryParams[key] || defaultValues[key]
}
$location.replace()
$location.search($scope.queryParams)
}, true)
}
})
.controller('ctrl1', function ($scope, syncUrlWithScope) {
syncUrlWithScope($scope, {foo: 'fooDefault'})
})
.controller('ctrl2', function ($scope, syncUrlWithScope) {
syncUrlWithScope($scope, {bar: 'barDefault'})
})
正如您所看到的,我使用2个观察者来从网址绑定到范围'还有“从范围到网址”。
但它有一个问题: https://github.com/angular-ui/ui-router/issues/1840
有没有更好的方法来实现相同类型的双向绑定而不会遇到这个问题?
答案 0 :(得分:0)
让我的视图对搜索参数的反应在js侧和手动通过url操作改变后我有类似的东西:
$scope.$on('$locationChangeSuccess', function () {
console.log('$locationChangeSuccess LogsController');
$scope.searchParams = parseSearchToTags($location.search());
... do something with params ...
});