Как получить доступ к составному виду из экземпляра вида элемента в Backbone Marionette

Я решил это до некоторой степени.

В настоящее время у нас есть система сборки, которая гарантирует, что все новые сборки находятся на пути постоянной длины (builds / 001, builds / 002 и т. д.), что позволяет избежать сдвигов в макете PE. После сборки инструмент сравнивает старые и новые двоичные файлы, игнорируя соответствующие поля PE и другие местоположения с известными поверхностными изменениями. Он также выполняет некоторые простые эвристики для обнаружения динамических игнорируемых изменений. Вот полный список вещей, которые следует игнорировать:

  • Временная метка PE и контрольная сумма
  • Запись каталога цифровой подписи
  • Экспортировать временную метку таблицы
  • Timestamp раздела отладчика
  • подпись, возраст и путь к файлу PDB
  • Временная метка ресурсов
  • Все версии файлов / продуктов в ресурсе VS_VERSION_INFO
  • Цифровые секция подписи
  • Запуск для заметок MIDL для встроенных библиотек типов (содержит строку timestamp)
  • __ FILE__, __DATE__ и __TIME__ макросы, когда они используются в качестве литералов (может быть широким или узким символом)

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

UPDATE: мы недавно открыли инструмент на GitHub . См. Раздел «Сравнение» в документации.

29
задан 10 July 2013 в 13:53
поделиться

2 ответа

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

  1. Либо передайте эти данные непосредственно в ItemView через вспомогательную функцию itemViewOptions в CompositeView. Примечание: эта опция была изменена на childViewOptions в марионетке 2.

  2. Вызвать метод непосредственно для всех дочерних представлений из CompositeView и передать все, что вы хотите, в этот метод.

  3. Запустить событие или прослушать его с помощью ItemView.

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

// Pass model into ItemView on init
var MyItemView = Backbone.Marionette.ItemView.extend({
  initialize : function (options) {
    this.parentsModel = options.parentsModel;
  }
});
var MyCompView = Backbone.Marionette.CompositeView.extend({
  itemViewOptions : function () { return { parentsModel: this.model }; }
  itemView : MyItemView
});


// Invoke function on ItemView, passing data in
var MyItemView = Backbone.Marionette.ItemView.extend({
  doSomethingWithParent : function (parentModel) {
    // do cool thing with parentModel
  }
});
var MyCompView = Backbone.Marionette.CompositeView.extend({
  itemView : MyItemView,
  onRender : function () {
    this.children.call("doSomethingWithParent", this.model);
  }
});


// Trigger event that ItemView knows about
var MyItemView = Backbone.Marionette.ItemView.extend({
  initialize : function () {
    this.listenTo(this, "special:event", function (parentModel) {
      // Do cool things
    });
  }
});
var MyCompView = Backbone.Marionette.CompositeView.extend({
  itemView : MyItemView,
  onRender : function () {
    this.children.each(_.bind(function (childView) {
      childView.trigger("special:event", this.model);
     }, this));
  }
});
33
ответ дан Andrew Hubbs 10 July 2013 в 13:53
поделиться

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

Я пытался сохранить пример кратким:

Пример составного шаблона - шаблон myView:

<h1>Page {{name}}</h1>
<h6>Children</h6>
<ul></ul>

Пример шаблона элемента - myItemTemplate:

{{name}} is child of: {{getParentName}}

Просмотры:

App.module( 'App.View', function( View ){

    View.MyItemView = Marionette.ItemView.extend({

        initialize: function( options ) {
            this.parentModel = options.parentModel;
        },

        template: myItemTemplate,

        tagName: 'li',

        templateHelpers: function() {

            var view = this;

            return {
                // Called by item template, returns parent model 'name' property.
                getParentName: function() {
                    return view.parentModel.get('name');
                }

            };
        }

    });

    View.MyView = Marionette.CompositeView.extend({

        template: myViewTemplate,

        itemView: View.MyItemView,

        itemViewContainer: 'ul',

        itemViewOptions: function() {

            return { parentModel: this.model };

        }

    });

});

Пример того, как это будет реализовано:

// example of how implementation
// parent model has an attribute called 'children', which is a collection of models
var children = parent.get('children');

var view = new App.View.MyView( { model: parent, collection: children } );

App.mainRegion.show( view );
1
ответ дан alettieri 10 July 2013 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: