Я решил это до некоторой степени.
В настоящее время у нас есть система сборки, которая гарантирует, что все новые сборки находятся на пути постоянной длины (builds / 001, builds / 002 и т. д.), что позволяет избежать сдвигов в макете PE. После сборки инструмент сравнивает старые и новые двоичные файлы, игнорируя соответствующие поля PE и другие местоположения с известными поверхностными изменениями. Он также выполняет некоторые простые эвристики для обнаружения динамических игнорируемых изменений. Вот полный список вещей, которые следует игнорировать:
. Через какое-то время компоновщик сделает некоторые разделы PE более крупными, не выбрасывая что-нибудь еще из выравнивания. Похоже, что он перемещает границу раздела внутри прокладки - это все равно нули, но из-за этого я получаю двоичные файлы с 1 байтовой разницей.
UPDATE: мы недавно открыли инструмент на GitHub . См. Раздел «Сравнение» в документации.
Если вы хотите получить доступ к данным от родителя CompositeView
, вы можете сделать несколько разных вещей.
Либо передайте эти данные непосредственно в ItemView
через вспомогательную функцию itemViewOptions
в CompositeView
. Примечание: эта опция была изменена на childViewOptions
в марионетке 2.
Вызвать метод непосредственно для всех дочерних представлений из CompositeView
и передать все, что вы хотите, в этот метод.
Запустить событие или прослушать его с помощью 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));
}
});
Думаю, я поделюсь, как предложение Эндрю Хаббса помогло мне. Я пытался отобразить свойство родительской модели, встроенное в шаблон моего элемента. Я использовал свойство 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 );