спасибо @denisnazarov за отслеживание этого.
пинг сеньор @machty
@machty, мы могли бы воспользоваться вашей помощью в этом
Итак, после борьбы с этим прошлой ночью я не уверен, что это совершенно нежелательно. Скажем, у вас есть следующий контроллер.
App.MyController = Ember.Controller.extend({
queryParams: ['filters'],
filters: ['starred']
});
Если вы установите filters
на null
и обновите страницу, каково ожидаемое поведение? Если вы не добавите null
в URL-адрес, для свойства контроллера будет установлено значение по умолчанию.
Это похоже на проблему в предыдущей реализации, заключающуюся в неоднозначности между ложными значениями и фактическим значением false. Теперь это кажется неоднозначным между defaultValue
и null
или undefined
.
Вот еще один пример с использованием логических параметров запроса: http://emberjs.jsbin.com/hamev/2/edit
Если значение по умолчанию установлено на null
, установка его на true
или false
фактически устанавливает его в строковую версию, 'true'
или 'false'
.
@HeroicEric, так в чем же убедительная причина установить для него значение null
если в течение его срока службы это будет логическое значение true
/ false
?
Это могло получиться неправильно; Мне просто любопытно, каковы варианты использования всех этих угловых случаев сериализации.
@machty Я попытался показать пример использования в jsbin.
Например, я показываю список пользователей и хочу иметь возможность фильтровать их, чтобы список содержал либо всех пользователей, либо пользователей с правами администратора, либо пользователей без прав администратора. Когда я хочу увидеть всех пользователей, я просто снимаю фильтр.
Разве подобные ситуации не то, для чего предназначены параметры запроса?
В идеале URL-адреса должны быть примерно такими:
/ users показывает всех пользователей
/ users? admin = true показывает всех админов
/ users? admin = false показывает всех пользователей, которые не являются администраторами
@HeroicEric @machty Я думаю, что идея заключалась в том, что если бы defaultValue на контроллере не было определено ( null
или undefined
), он по умолчанию использовал бы строки. Это объясняет, почему true
и false
конечном итоге становятся их строковыми версиями, поскольку по умолчанию для сериализации используются строки.
Я думаю, если вы хотите, чтобы свойство было установлено на null
тогда нам нужно получить тип откуда-то еще. @machty. Будет ли это хорошей причиной для возможности добавления типа в конфигурацию queryParams
на маршруте?
Если бы у нас было это, вы могли бы установить тип как 'boolean
'и установить значение по умолчанию null
.
У меня есть этот пример JSBin, и мне интересно, связано ли то, что я вижу, с этой проблемой:
http://jsbin.com/dipajezi/1/edit
По сути, у меня есть этот параметр запроса foo
со значением по умолчанию null
, и в первый раз, когда мой хук модели вызывается при запуске приложения, значение параметра равно null
. Когда значение параметра равно null
, я не хочу использовать этот параметр для запроса сервера, потому что он означает «нет значения».
Запрос: ?page=1
Когда я нажимаю кнопку «Следующая страница», я снова переключаюсь, но на этот раз изменяю параметр запроса page
. На этот раз параметр запроса foo
имеет строковое значение "null"
, что довольно странно. В этом случае я все равно хотел бы иметь значение null
, чтобы я мог легко проверить, что параметр не имеет значения.
Запрос: ?page=1
а не ?page=1&foo=null
Наконец, когда я нажимаю кнопку ChangeFoo
, я снова перехожу, на этот раз устанавливая для параметра запроса foo
любое значение. Теперь, когда значение не равно нулю, я могу использовать это значение для построения строки запроса.
Запрос ?page=1&foo=3
@raytiley Просто написал заметку на https://github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff -0631ecfe6138cf2c2eb2d94369c3e846R1640.
Если я явно установил qp равным null
, он будет преобразован в строку в хуке модели. Это кажется неправильным, так как null
должно представлять «нет значения», и если человеку действительно нужна пустая строка, он может создать ее на основе значения null
.
В противном случае, если вы хотите передать QP, которые имеют только значения, вам нужно сделать params.myQP && params.myQp !== "null"
..
Я думаю, что это устарело, но откроется снова, если кто-то сможет продемонстрировать проблему в JSBin, который использует следующие файлы ember.js: http://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414 -f5ed36c2a1a2.js
_Если кто-нибудь найдет это через Google._
Проблема в основном решена, но остается крайний случай, когда, если параметр запроса не установлен на контроллере, он сериализует null
в 'null'
.
var AnimalsController = Ember.Controller.extend({
queryParams: ['myCat']
// myCat: null // deliberately not set, to illustrate the issue
});
export default AnimalsController;
Что касается варианта использования
export default Ember.Controller.extend({
queryParams: [{
redevelopment: {
type: 'boolean'
}
}],
redevelopment: null
});
Рабочий тлеющий уголек: https://ember-twiddle.com/3afa1091106a91ce2c1734ae2998bc3f?openFiles=controllers.application.js%2C&route=%2F%3Fredevelopment%3Dtrue
С каких это пор QP позволяют устанавливать тип? Или вы просто предлагаете новый API?
Вроде бы без документов. Глядя сюда , кажется, что это можно переопределить.
Это мило!
Спасибо, @allthesignals , это так полезно для вашего решения.
Как насчет этого решения?
{ key: undefined }
до ?
_ (не входит в комплект) _
{ key: null }
на ?key
{ key: '' }
до ?key=
{ key: 'null' }
до ?key=null
Хороший список!
Я бы проголосовал за это:
{ key: undefined }
до [nothing]
_ (не входит в комплект) _
{ key: null }
до [nothing]
_ (не входит в комплект) _
{ key: '' }
до ?key
{ key: 'null' }
до ?key=null
и, возможно, также:
{ key: false }
до [nothing]
_ (не входит в комплект) _
{ key: true }
до ?key
Самый полезный комментарий
_Если кто-нибудь найдет это через Google._
Проблема в основном решена, но остается крайний случай, когда, если параметр запроса не установлен на контроллере, он сериализует
null
в'null'
.