Проверка базовой модели - PullRequest
5 голосов
/ 18 января 2012

Я столкнулся со странным поведением проверки модели в Backbone.js.

При первом создании модели, например,

var foo = new Foo({
    bar: 42
});

Backbone вызывает foo.set(), передавая в качестве параметраданная карта {bar: 42}, как видно из источника .При этом он также передает параметры {silent: true}, как в строке

this.set(attributes, {silent : true});

Это имеет смысл, поскольку наличие silent === true позволяет избежать запуска событий change, которые в этом не имеют смысла.контекст.

По какой-то причине я не могу понять, однако, silent === true также препятствует проверке ;см. источник в строке

if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;

Таким образом, кажется, что модель никогда не проверяется при их создании, но обычно это происходит при изменении некоторых атрибутов.Более того, наличие валидации неразрывно связано с действием отправки change событий, что является чем-то совершенно ортогональным.

Может кто-нибудь объяснить, почему это так?Какой будет простой и надежный способ решения этой проблемы?

Я мог бы вручную позвонить _performValidation, но это имеет два недостатка:

  • во-первых, эточто-то, что я мог бы просто забыть
  • секунду, _performValidation не является частью API и, возможно, это изменится в будущих версиях.

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Действительно, я думаю, что это ошибка в Backbone.JS.

Здесь есть открытый вопрос о GitHub: https://github.com/documentcloud/backbone/issues/870

Редактировать: В новой версии0.9.1 из Backbone.js, вы можете проверить, действительна ли модель с методом isValid (http://backbonejs.org/#Model-isValid)

0 голосов
/ 17 января 2013

На данный момент единственный способ сохранить безопасность - никогда не передавать хэш параметров.

Я всегда так делаю:

var m = new MyModel();
// and then I do all the sets
m.set(...);
m.set(...);
m.set(...);

В случае, если некоторые данные JSON поступают из БД, предполагается, что они уже были проверены, и поэтому в этом случае можно:

var m = MyMOdel(hashFromDB);

Имеет ли это смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...