Ember.js: Параметры запроса со значениями null или undefined сериализуются в строки

Созданный на 20 мар. 2014  ·  21Комментарии  ·  Источник: emberjs/ember.js

Самый полезный комментарий

_Если кто-нибудь найдет это через Google._

Проблема в основном решена, но остается крайний случай, когда, если параметр запроса не установлен на контроллере, он сериализует null в 'null' .

var AnimalsController = Ember.Controller.extend({

  queryParams: ['myCat']
  // myCat: null // deliberately not set, to illustrate the issue

});

export default AnimalsController;

Все 21 Комментарий

спасибо @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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги