Отображение локального хранилища в магистрали

#jquery #backbone.js #underscore.js

#jquery #backbone.js #underscore.js

Вопрос:

Я новичок Backbone.js . Я использую конструктор коллекции для передачи данных и отображения в view ( var salecollection = new SaleCollection([{QuotationID: 2,QuotationNumber:'222'},{QuotationID:3,QuotationNumber:'333'}]); ).

И теперь я хочу отображать данные из localStorage , а не брать данные из конструктора коллекции.

Данные localStorage устанавливаются другой функцией, а не методом магистрали. С помощью ( window.localStorage.setItem ).

Любая идея, пример были бы признательны. Спасибо.

SaleView.js

 define(["jquery" ,
   "underscore" ,
   "backbone" ,
   "models/SaleModel",
   "text!templates/Quotation/saleTemplate.html",
   "collections/SaleCollection"
],function($ , _ , Backbone , saleModel,saleTemplate, SaleCollection){
    var saleView = Backbone.View.extend({
      initialize: function() {
        this.render();
      },
      tagName: '<tr>',
      render: function(){
        var sale = _.template(saleTemplate);
        this.$el.html(sale((this.model.toJSON())));
      }
    });
    return saleView;
});
 

SaleCollectionView.js

 define(["jquery" ,
        "underscore" ,
        "backbone",
        "views/Sale",
        "collections/SaleCollection",
        "models/SaleModel",
],function($, _, Backbone, SaleView, SaleCollection, SaleModel){
    var saleCollectionView = Backbone.View.extend({
      tagName: 'table',
      render: function(){
        this.collection.each(function(sale){
            var saleView = new SaleView({ model: sale });
            this.$el.append(saleView.el);
        }, this);
      }
    });
    return saleCollectionView;
});
 

SaleModel.js

 define(["underscore" , "backbone"],function(_ , Backbone){
  var saleModel = Backbone.Model.extend({
    defaults : {
        QuotationID  : "1",
        QuotationNumber : "111"
    }
  });
  return saleModel;
});
 

SaleCollection.js

 define(["underscore",
  "backbone",
  "models/SaleModel"
],function(_, Backbone,saleModel){
  var saleCollection = Backbone.Collection.extend({
    model : saleModel,
    url: "http://localhost:/Website"
  });
  return saleCollection;
});
 

CustomerView.js

 define(["jquery" ,
  "underscore" ,
  "backbone",
  "text!templates/Customer/customerTemplate.html",
  "text!templates/Quotation/saleTemplate.html",
  "views/Customer/SaleCollectionView",
  "collections/SaleCollection",
  "views/Customer/SaleView",
  "models/SaleModel"
],function($, _, Backbone, WebConfig, CustomerProfile, Sale, SaleCollectionView, SaleCollection, SaleView, SaleModel){
var CustomerView = Backbone.View.extend({
    initialize: function() {
    },
    el : "#container",
    events : {
        'click #saleTab' : 'sale',
    },
    'sale' : function(){
        var salemodel = new SaleModel();
        var saleview = new SaleView({model : salemodel});

        var salecollection = new SaleCollection([{QuotationID: 2,QuotationNumber:'222'},{QuotationID:3,QuotationNumber:'333'}]);
        var salecollectionview = new SaleCollectionView({ collection: salecollection},{el:'#saleTabDiv'});

        salecollectionview.render();
        $('.containerHis').append(salecollectionview.el);
    }
    render: function(){
        var customerProfile = _.template(CustomerProfile);
        $(this.el).html(customerProfile);
    }
  });
  return CustomerView;
});
 

saleTemplate.html

 <td><%= QuotationID %></td>
<td><%= QuotationNumber %></td>
 

Комментарии:

1. В чем собственно вопрос? Сохраните json в localstorage, извлеките его обратно и вставьте в конструктор.

2. Я просто не знаю, как это сделать….

Ответ №1:

Вы можете создавать магистральные модели / коллекции из любого источника данных. Вот пример из localStorage:

 var Book = Backbone.Collection.extend();

var Library = Backbone.Collection.extend({
  model: Book
});

var model = new Book(JSON.parse(localStorage.getItem('book')));
var collection = new Library(JSON.parse(localStorage.getItem('books')));
 

Чтобы сохранить в localStorage, вы могли бы сделать это следующим образом:

 localStorage.setItem('book', JSON.stringify(Book.toJSON()));
localStorage.setItem('books', JSON.stringify(Library.toJSON()));
 

Надеюсь, это поможет.

Комментарии:

1. Я понимаю… так что, если localStorage выглядит так {"UID": "00000000-0000-0000-0000-00000000006e","RedeemData": [],"AgingData": [],"HistoryData": [{"QuotationID": "00000000-0000-0000-0000-0000000001de","QuotationNumber": "891115-0001"},{"QuotationID": "00000000-0000-0000-0000-0000000001df","QuotationNumber": "891213-0001"},.....{}]} , я хочу отобразить его из HistoryData списка.

2. Я имею в виду, я хочу получить QuotationID и QuotationNumber из HistoryData .

3. Затем вам нужно будет проанализировать JSON и создать объект только с теми значениями, которые вы хотели бы.

4. Не могли бы вы показать мне какой-нибудь пример по этому поводу? Извините, я действительно новичок в этом. Заранее спасибо.

5. Я считаю, что это отдельная проблема, пожалуйста, примите ответ или перефразируйте свой вопрос, потому что я считаю, что на него был дан ответ. Если у вас есть вопросы о том, как выбрать определенные атрибуты из массива объектов, возможно, почитайте Lodash, _.map , и _.pick вам придет в голову что-то вроде _.map(arr, function(val) { return _.pick(val, ['QuotationNumber', 'QuotationID']); }); . Надеюсь, это поможет.

Ответ №2:

Хотя я не совсем понимаю, каковы ваши точные ожидания. Но я предположил следующим образом.

  1. Вы создали коллекцию, в которой хотите сохранить текущую / текущую коллекцию в переменной localStorage. (или) Вы хотели сохранить текущие / текущие данные коллекции в localStorage перед отправкой их на сервер с помощью функции sync().
  2. Вы сохранили коллекцию с помощью window.localStorage.setItem … следующим образом
     var bookModel = Backbone.Model.extend({});
    var bookCollection = Backbone.Collection.extend({
    
    // Your rest of the functions goes here...
    sync: function(method, collection, options)
    {
      switch(method)
      {
         case 'create': window.localStorage.setItem('myCurrentCollection' , JSON.stringify(collection));
                       break;
         case 'update': window.localStorage.setItem('myCurrentCollection' , JSON.stringify(collection));
                       break;    
       }
    
    }
    
    });
     
  3. Теперь в определенном представлении вы хотите получить и отобразить значение localStorage.
             <% var collectionValue = window.localStorage.getItem('myCurrentCollection');
             _.each(collectionValue.toJSON(), function(data){  %>
             <td> <% = data.Id %> </td>
             <td> <% = data.name %> </td> 
             <%});%>
    
             //your parse and show code goes here...
     

Надеюсь, это поможет вам, если мое предположение верно.

Комментарии:

1. Но, конечно, я просто хочу использовать localStorage для отображения в моем представлении при загрузке страницы после поиска пользователя… вместо этого в представлении будут отображаться данные из модели.

2. коллекция — это только группа моделей. Попробуйте добавить много моделей, затем сохраните их в localStorage как коллекцию. После этого извлеките то, что вы хотели.