Как создать идентификатор модели с помощью Backbone.js

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

Когда я создаю новую модель, нужно создать базовую основу и установить идентификатор, или я должен реализовать метод генерации идентификатора, или есть какой-то механизм, в котором я "PUT" данные на сервер, который генерирует id и возвращает модель с идентификатором?

Ответ 1

или есть какой-то механизм, в котором я "PUT" данные на сервер, который генерирует идентификатор и возвращает модель с идентификатором?

Вид. Когда вы вызываете метод сохранения вашей модели, позвоночник делает POST XHR, и ваш сервер приложений должен отвечать JSON, содержащий идентификатор. Здесь вы можете увидеть пример: http://addyosmani.com/blog/building-backbone-js-apps-with-ruby-sinatra-mongodb-and-haml/

Цитата из ссылки:

post '/api/:thing' do 
  # parse the post body of the content being posted, convert to a string, insert into 
  # the collection #thing and return the ObjectId as a string for reference 
  oid = DB.collection(params[:thing]).insert(JSON.parse(request.body.read.tos)) 
  "{\"id\": \"#{oid.to_s}\"}" 
end

Если вы не знаете, что Ruby учитывает то, что последнее выражение, которое оценивается, автоматически возвращается методом.

Ответ 2

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

Предположим, вы определили модель - отпустите Jurassic Park.

// Define your model
var Dinosaur = Backbone.Model.extend({
    defaults: {
        cavemanEater: undefined    // Has one property, nom nom or not.
    },
    urlRoot: 'dino'               // This urlRoot is where model can be saved or retrieved
});

var tRex = new Dinosaur({'cavemanEater':true});

Теперь вы создали экземпляр динозавра, который является едой. Рев.

console.log(tRex);

Что вы должны заметить, так это то, что в свойствах tRex ваша модель не имеет идентификатора. Вместо этого вы увидите идентификатор cID, который можно считать временным идентификатором, который Backbone автоматически присваивает вашим моделям. Когда модель не имеет идентификатора, она считается новой. Концепция сохранения модели (либо в базе данных, либо в локальном хранилище) позволяет вернуться к этому ресурсу после того, как вы его создали, и сделать что-то вроде save (PUT) или уничтожить (DELETE). Было бы трудно найти этот ресурс, если бы у вас не было никакого способа указать прямо на него! Чтобы найти этот ресурс, вашей модели нужен идентификатор, чего-то в данный момент нет.

Так как приведенные выше ответы объяснили, что это работа вашей базы данных (или localstorage или какого-либо другого решения), чтобы предоставить Backbone идентификатор ресурса. В большинстве случаев это происходит из самого идентификатора ресурса, ака - идентификатора первичного ключа вашей модели в некоторой таблице.

С моей установкой я использую PHP и mySQL. У меня будет таблица под названием "Динозавр", и каждая строка будет постоянным представлением моей модели динозавров. Таким образом, у меня будет столбец id (уникальный auto-incrementing int) и cavemanEater (bool).

Поток обмена данными происходит следующим образом.

  • Вы создаете модель.
  • Модель новая, поэтому она имеет только идентификатор cID - нет надлежащего идентификатора.
  • Вы сохраняете модель.
  • json-представление вашей модели отправлено на ваш сервер (POST)
  • Ваш сервер сохраняет его в таблице и присваивает ему идентификатор ресурса.
  • Сервер SENDS BACK представляет json-представление данных {id: uniqueID}
  • Магистраль ПОЛУЧИТ это json-представление с id
  • Backbone автоматически обновляет вашу модель с помощью идентификатора.

Вот как выглядит аннотированный код.

КЛИЕНТ:

tRex.save();
// {'cavemanEater':true} is sent to my server
// It uses the urlRoot 'dino' as the URL to send. e.g. http://www.example.com/dino

SERVER:

// Is setup to accept POST requests on this specific ROUTE '/dino'
// Server parses the json into something it can work with, e.g. an associative array
// Server saves the data to the database. Our data has a new primary id of 1.
// Data is now persisted, and we use this state to get the new id of this dino.

$dinoArray = array('id'=>1, 'cavemanEater'=>true);
$dinoJSON = json_encode($dinoArray);

// Server does something to send $dinoJSON back.

КЛИЕНТ:

// If successful, receives this json with id and updates your model.

Теперь ваш tRex имеет id = 1. Или я должен сказать...

tRex.toJSON();
// RETURNS {'id':'1', 'cavemanEater':'true'}

Поздравляю. Если вы сделаете это tRex.isNew(), оно вернет false.

Магистраль умна. Он знает POST новые модели и модели PUT, у которых уже есть идентификатор ресурса.

В следующий раз вы сделаете следующее:

tRex.save();

Магистраль сделает запрос PUT на следующий URL.

http://www.example.com/dino/1

Это поведение по умолчанию. Но вы заметите, что URL-адрес отличается от сохранения. На сервере вам понадобится маршрут, который принимает /dino/: id в отличие от /dino

Он будет использовать шаблон маршрута /urlRoot/: id для ваших моделей по умолчанию, если вы не измените его в противном случае.

К сожалению, динозавры вымерли.

tRex.destroy();

Это вызовет... Можете ли вы догадаться? Ага. УДАЛИТЬ запрос /dino/ 1.

Для работы Backbone ваш сервер должен различать различные запросы к различным маршрутам. Есть несколько технологий на стороне сервера, которые могут это сделать.

Кто-то упомянул Синатру, если вы используете Ruby. Как я уже сказал, я использую PHP, и я использую SLIM PHP Framework. Он вдохновлен Синатрой, поэтому он похож, и мне это нравится. Автор пишет чистый код. Как эти реализации RESTful-сервера работают вне сферы обсуждения.

Я думаю, что это базовое полное перемещение новых данных Backbone без id, через интернетов на ваш сервер, где он генерирует, и отправляет обратно идентификатор ресурса, чтобы ваша модель жила счастливо. (Или destroy() не...)

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

Другие похожие ответы: Способы сохранения данных базовой модели JB

Ответ 3

Что я понимаю из вашего вопроса, так это то, что вы хотите иметь коллекцию с моделями, которые существуют на сервере. Чтобы собрать эти коллекции в коллекцию, вам нужно добавить вызов коллекции 'fetch()' в коллекцию.

URL-адрес будет "/users" или что-то подобное, что должно было бы вернуть массив объектов с пользовательскими данными. Затем каждый элемент массива будет передан в UserCollection.add(). Ну, на самом деле это будет передано сразу, но вы понимаете.

После этого ваша коллекция будет заполнена. URL-адрес модели предназначен для обновления и сохранения отдельной модели. URL-адрес коллекции также будет использоваться для создания моделей. Базовая синхронизация RESTful, как Ruby on Rails. Вы можете узнать больше об этом в документации по Ruby on Rails:

http://guides.rubyonrails.org/routing.html

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

Теперь, когда вы добавляете новую модель на основе пользовательского ввода, вы делаете что-то вроде этого:

var HomeModel = Backbone.Model.extend({
    defaults: {
        lead: "not logged in",
    },

    url: 'test.php',

    initialize: function(){
        _.bindAll(this, 'handleSave', 'handleError');
        // Save already knows if this.isNew.
        this.save(undefined, {success: this.handleSave, error: this.handleError});
    },

    handleSave: function(model, response){
        this.model.reset(model);
    },

    handleError: function(){

    },
});

var HomeView = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this, 'render');
        this.model = new HomeModel();
        this.model.bind("change", this.render);
    },

    el: 'div',

    render: function() {    
        // Do things to render...
    }
});

var homeView = new HomeView();

Пример из другого вопроса, на который я ответил, я просто добавляю соответствующие вещи.

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