Сохранение данных с обновленными значениями в Backbone.js

Я работаю над приложением MVC с Backbone.js.

Предполагая, что у меня есть представление сведений о пользователе: -

var userDetailsView = Backbone.View.extend({
    model: userModel,
    el: "#userDteails",
    template: Handlebars.templtas.userDetails
    initialize: function () {
        this.model = new userModel();

        this.model.fetch({
            success: function (data) {
                this.render();
            }
        });
    },
    render: function () {
        $(this.el).html(this.template());
    },
    events: {
        "", "saveUserDetails" //event for save
    },
    saveUserDetails: function () {
        //How do I get the update value of FirstName??
    }
});

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

<div id="userDetails">
  <input type="text" value="{{FirstName}}" id="firstName"/>
 </div>

Пожалуйста, игнорируйте ошибки кода, так как это просто фиктивный код, теперь, если мне нужно сохранить данные пользователя (например, для FirstName). Тогда как мне получить обновленное значение?

Должно ли быть:-

saveUserDetails: function () {
        //How do I get the update value of FirstName??
        this.model.set("", $('#Firstname').val());
    }

или я должен выполнить преобразование данных формы в JSON и обновить мой this.model т.е. создать мою HTML-разметку с атрибутом name: -

<form>
    First Name:<input type="text" name="Fname" maxlength="12" size="12"/> <br/>
</form>

и используйте функцию, предложенную Tobias Cohen

$.fn.serializeObject = function()
{
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

и делай :-

$('form').submit(function() {
        $('#result').text(JSON.stringify($('form').serializeObject()));
        return false;
    });

Я не эксперт в Backbone, но видел как минимум 10-15 примеров и руководств, обучающих backbone. Из них я нашел два вышеуказанных способа сделать это.

Пожалуйста, дайте мне знать, как лучше поступить.


person Shubh    schedule 30.11.2013    source источник


Ответы (1)


Оба пути в порядке! Это зависит от того, насколько сложно ваше сопоставление HTML ‹-> Model. Если все можно сделать с помощью div/span/input с именем/именем данных или чем-то еще, что вам нравится, то сериализация маршрута проста. Но как только вы вырастете из этого, вы, вероятно, будете смотреть на более пользовательские способы, которые технически похожи на ваш первый вариант, с немного большей логикой, чем просто получение .val() из поля ввода.

Я действительно не понимаю оба ваших примера обработки, но вы сказали не беспокоиться о деталях... так что :) Что касается формы, я предполагаю, что .text() предназначен только для целей отладки? Правильный код, вероятно, сначала предотвратит Default() при отправке формы, а затем выполнит model.save($('form').serializeObject()) для обновления модели и одновременного сохранения ее на сервере. С некоторым успехом / ошибкой обратный вызов добавлен для хорошей меры!

person Enders    schedule 01.12.2013