Мне нужно сделать своего рода тройной биндинг, т.е. изменение модели должно отражаться на адресной строке и наоборот, изменение параметра в строке должно менять модель. Что бы формировалась ссылка для текущего состояния фильтра, которой можно будет поделиться.
Я решил довольно костыльным методом:
$scope.$watch('selectedStaff', function () {
var currentStaffId = ($scope.selectedStaff) ? $scope.selectedStaff.id : 0;
if ($scope.selectedStaff !== undefined /*&& $scope.selectedStaff !== null*/) {
$location.search('fStaffId', (currentStaffId) ? currentStaffId : null);
/* Тут обновление данных... */
}
});
$scope.$on('$routeUpdate', function () {
var currentStaffId = parseInt($routeParams.fStaffId);
if (currentStaffId > 0 && $scope.staffList.length > 0) {
for (var k in $scope.staffList) {
if ($scope.staffList[k]['id'] === currentStaffId) {
$scope.selectedStaff = $scope.staffList[k];
break;
}
}
}
});
Но работает это довольно криво, то сбрасывается параметр в адресной строке (т.к. $watch сначала дважды вызывается со значениями null и undefined), приводит к лишним запросам к серверу, не обновляется селект... В общем, проблемный вариант.
Больше я пока ничего придумать не смог, опыта очень мало. Может подскажете как это правильно реализовать?