Думаю, я поделюсь, как предложение Эндрю Хаббса помогло мне. Я пытался отобразить свойство родительской модели, встроенное в шаблон моего элемента. Я использовал свойство 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 );
Вы можете изменить то, на что указывает foo
, используя y
:
Foo foo = new Foo("1");
void Bar(ref Foo y)
{
y = new Foo("2");
}
Bar(ref foo);
// foo.Name == "2"
Есть случаи, когда вы хотите изменить фактическую ссылку , а не объект, на который указывает:
void Swap<T>(ref T x, ref T y) {
T t = x;
x = y;
y = t;
}
var test = new[] { "0", "1" };
Swap(ref test[0], ref test[1]);
Джон Скит написал отличную статью о передаче параметров в C #. Он четко описывает точное поведение и использование передачи параметров по значению, по ссылке ( ref
) и по выходу ( out
).
Вот важная цитата с той страницы в отношение к параметрам ref
:
значения переменных, используемых в
вызов функции-члена - они используют
сами переменные. Скорее, чем
создание нового хранилища для
переменная в члене функции
декларация, то же место хранения
используется, поэтому значение переменной
в члене функции и значении
ссылочного параметра всегда будет
быть таким же. Необходимые справочные параметры
модификатор ref как часть
декларация и призыв - это
значит всегда ясно, когда ты
передача чего-либо по ссылке.
Когда вы передаете ссылку введите ключевое слово ref, вы передаете ссылку по ссылке, и вызываемый вами метод может присвоить параметру новое значение. Это изменение распространится на вызывающую область. Без ref ссылка передается по значению, а этого не происходит.
В C # также есть ключевое слово out, которое очень похоже на ref, за исключением того, что с ref, аргументы должны быть инициализированы перед вызовом метода. , а с "out" вы должны присвоить значение в методе получения.
Это позволяет вам изменять переданная ссылка. например
void Bar()
{
var y = new Foo();
Baz(ref y);
}
void Baz(ref Foo y)
{
y.Name = "2";
// Overwrite the reference
y = new Foo();
}
Вы также можете использовать out , если вас не волнует переданная ссылка:
void Bar()
{
var y = new Foo();
Baz(out y);
}
void Baz(out Foo y)
{
// Return a new reference
y = new Foo();
}
Еще одна связка кода
class O
{
public int prop = 0;
}
class Program
{
static void Main(string[] args)
{
O o1 = new O();
o1.prop = 1;
O o2 = new O();
o2.prop = 2;
o1modifier(o1);
o2modifier(ref o2);
Console.WriteLine("1 : " + o1.prop.ToString());
Console.WriteLine("2 : " + o2.prop.ToString());
Console.ReadLine();
}
static void o1modifier(O o)
{
o = new O();
o.prop = 3;
}
static void o2modifier(ref O o)
{
o = new O();
o.prop = 4;
}
}