Показать сообщение отдельно
  #1 (permalink)  
Старый 06.10.2014, 11:25
Аватар для Sufir
Аспирант
Отправить личное сообщение для Sufir Посмотреть профиль Найти все сообщения от Sufir
 
Регистрация: 15.06.2008
Сообщений: 47

Двусторонняя связь location param и model
Мне нужно сделать своего рода тройной биндинг, т.е. изменение модели должно отражаться на адресной строке и наоборот, изменение параметра в строке должно менять модель. Что бы формировалась ссылка для текущего состояния фильтра, которой можно будет поделиться.

Я решил довольно костыльным методом:
$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), приводит к лишним запросам к серверу, не обновляется селект... В общем, проблемный вариант.
Больше я пока ничего придумать не смог, опыта очень мало. Может подскажете как это правильно реализовать?

Последний раз редактировалось Sufir, 06.10.2014 в 11:32.
Ответить с цитированием