Двусторонняя связь 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), приводит к лишним запросам к серверу, не обновляется селект... В общем, проблемный вариант. Больше я пока ничего придумать не смог, опыта очень мало. Может подскажете как это правильно реализовать? |
$location.search - я так же делаю. Еще сравниваю с default значениями чтобы все подряд в строку не пихать.
Чтобы watch не срабатывал изначально, поставь проверку newVal !== prevVal. Я обновляю url сам, то есть не через watch, а когда что-то серьезно изменилось в состоянии app (в моем случае таких функций немного). Про обращения на сервер и селект не понял. |
Цитата:
У меня список объектов на странице, и целый ряд всевозможных фильтров для него, при изменении значений которых должен и список меняться, соответсвенно. Цитата:
В общем кое-как я порешал и настроил, но как хорошо и правильно сделать пока не нашел. |
При первой загрузке страницы фильтры можно же брать из строки или дефолтные, не вижу смысла ждать - шли один запрос сразу со всеми полученными (как значения) фильтрами. А ng-change на селектах пусть проверяет переменную вроде initialLoadIsActive.
|
Цитата:
|
Цитата:
|
Цитата:
и причём здесь f5? перезагрузка страницы (f5, ctrl-f5) эквивалентна начальной загрузке по содержимому адресной строки. вам нужно отображать в адресную строку изменения ваших селектов, никто не спорит с этим. а вот зачем обратный биндинг? я не говорю, что вам не нужно парсить адресную строку, я сказал только что это достаточно сделать однократно, при начальной загрузке (инициализации) страницы. динамически отслеживать нет никакой необходимости. ну это, конечно, если ваше начальство не считает иначе..... :) |
если просто что-то ввести, то ничего не произойдет, если нажать enter, то отработает router если я не путаю и получится изначальная загрузка app из параметров адресной строки.
Проверять что там изменил пользователь в адресной строке без перезагрузки (enter) state конечно не стоит. Согласен. |
Ну и ладушки.
|
Цитата:
Соответственно в любом случае по готовности фильтров данные нужно обновить. Хотя бы в случае обнаружения такового несоответствия. Цитата:
|
Часовой пояс GMT +3, время: 12:47. |