Магистраль - проверка не работает при создании, только обновление / редактирование? - PullRequest
2 голосов
/ 20 февраля 2012

Итак, я могу очень хорошо проверить, когда я редактирую существующий элемент.Однако, если я хочу создать, проверка по некоторым причинам не начинается.Вместо этого я вижу ошибки ниже:

//this is if the field I want to validate is empty
Uncaught TypeError: Object #<Object> has no method 'get'

//this is if everything in the form is filled out
Uncaught TypeError: Cannot call method 'trigger' of undefined

Вот (то, что я думаю) относительная часть моего js.Извините, если это перегрузка, я хотел бы добавить как можно больше, чтобы быть как можно более конкретным:

Comic = Backbone.Model.extend({
    initialize: function () {
        this.bind("error", this.notifyCollectionError);
        this.bind("change", this.notifyCollectionChange);
    },
    idAttribute: "ComicID",
    url: function () {
        return this.isNew() ? "/comics/create" : "/comics/edit/" + this.get("ComicID");
    },
    validate: function (atts) {
        if ("Name" in atts & !atts.Name) {
            return "Name is required";
        }
        if ("Publisher" in atts & !atts.Publisher) {
            return "Publisher is required";
        }
    },
    notifyCollectionError: function (model, error) {
        this.collection.trigger("itemError", error);
    },
    notifyCollectionChange: function () {
        this.collection.trigger("itemChanged", this);
    }
});
Comics = Backbone.Collection.extend({
    model: Comic,
    url: "/comics/comics"
});
comics = new Comics();

FormView = Backbone.View.extend({
    initialize: function () {
        _.bindAll(this, "render");
        this.template = $("#comicsFormTemplate");
    },
    events: {
        "change input": "updateModel",
        "submit #comicsForm": "save"
    },
    save: function () {
        this.model.save(
            this.model.attributes,
            {
                success: function (model, response) {
                    model.collection.trigger("itemSaved", model);
                },
                error: function (model, response) {
                    model.trigger("itemError", "There was a problem saving " + model.get("Name"));
                }
            }
        );

        return false;
    },
    updateModel: function (evt) {
        var field = $(evt.currentTarget);
        var data = {};
        var key = field.attr('ID');
        var val = field.val();
        data[key] = val;
        if (!this.model.set(data)) {
            //reset the form field
            field.val(this.model.get(key));
        }
    },
    render: function () {
        var html = this.template.tmpl(this.model.toJSON());
        $(this.el).html(html);
        $(".datepicker").datepicker();
        return this;
    }
});

NotifierView = Backbone.View.extend({
    initialize: function () {
        this.template = $("#notifierTemplate");
        this.className = "success";
        this.message = "Success";
        _.bindAll(this, "render", "notifySave", "notifyError");
        comics.bind("itemSaved", this.notifySave);
        comics.bind("itemError", this.notifyError);
    },
    events: {
        "click": "goAway"
    },
    goAway: function () {
        $(this.el).delay(0).fadeOut();
    },
    notifySave: function (model) {
        this.message = model.get("Name") + " saved";
        this.render();
    },
    notifyError: function (message) {

        this.message = message;
        this.className = "error";
        this.render();
    },
    render: function () {
        var html = this.template.tmpl({ message: this.message, className: this.className });
        $(this.el).html(html);
        return this;
    }
});

var ComicsAdmin = Backbone.Router.extend({

    initialize: function () {
        listView = new ListView({ collection: comics, el: "#comic-list" });
        formView = new FormView({ el: "#comic-form" });
        notifierView = new NotifierView({el: "#notifications" });
    },
    routes: {
        "": "index",
        "edit/:id": "edit",
        "create": "create"
    },
    index: function () {
        listView.render();
    },
    edit: function (id) {
        listView.render();
        $(notifierView.el).empty();
        $(formView.el).empty();
        var model = comics.get(id);
        formView.model = model;
        formView.render();
    },
    create: function () {
        var model = new Comic();
        listView.render();
        $(notifierView.el).empty();
        $(formView.el).empty();
        formView.model = model;
        formView.render();

    }
});

jQuery(function () {
    comics.fetch({

        success: function () {
            window.app = new ComicsAdmin();
            Backbone.history.start();
        },
        error: function () {

        }
    });
})

Итак, разве мое творение не должно пройти проверку?Почему нет?

Ответы [ 2 ]

4 голосов
/ 31 августа 2012

При создании нового экземпляра модели метод validate не вызывается.Согласно базовой документации проверка вызывается только перед установкой или сохранением.

Я также борюсь с этой проблемой и нашел решения в связанных вопросах:

  • Вы можете создать новую модель и затем установить ее атрибуты (см. вопрос 9709968 )
  • Более элегантный способ - вызвать метод validate при инициализации модели (см. вопрос 7923074 )

Я не полностью удовлетворен этими решениями, потому что создание нового экземпляра модели, как описано в базовой документации , не должно происходить при возникновении ошибки.К сожалению, в обоих решениях вы все еще застряли с новым экземпляром модели.

edit: Застрять с новым экземпляром модели на самом деле довольно приятно.Таким образом, вы можете дать отзыв пользователю о том, почему он не прошел валидатор, и дать возможность исправить его / ее ввод.

2 голосов
/ 23 февраля 2012

OK. Так что у меня здесь небольшой успех.

Во-первых, я написал свою собственную платформу проверки, Backbone.Validator , поскольку мне не нравились те из них, которые я нашел.

Во-вторых, я могу получить платформу проверки для запуска процедуры проверки, установив silent: false в объекте, предоставленном при создании new Model.

Наряду с использованием параметра use_defaults из моей среды проверки, я могу переопределить неверные данные во время настройки при первоначальном тестировании. Я все еще работаю над еще несколькими тестами, но, похоже, все идет нормально с консоли браузера Chrome.

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