Если вы хотите получить доступ к данным от родителя 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));
}
});
Вы можете использовать defaultdict :
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = ['1', '2']
>>> for i in a:
... for j in range(int(i), int(i) + 2):
... d[j].append(i)
...
>>> d
defaultdict(<type 'list'>, {1: ['1'], 2: ['1', '2'], 3: ['2']})
>>> d.items()
[(1, ['1']), (2, ['1', '2']), (3, ['2'])]
Вы можете построить его с пониманием списка, как это :
>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2'])
{'1': [1, 2], '2': [2, 3]}
И для второй части вашего вопроса используйте defaultdict
>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Используйте setdefault
:
d = dict()
a = ['1', '2']
for i in a:
for j in range(int(i), int(i) + 2):
d.setdefault(j, []).append(i)
print d # prints {1: ['1'], 2: ['1', '2'], 3: ['2']}
Функция с довольно странным названием setdefault
говорит: «Получить значение с помощью этого ключа, или, если этот ключ не является» t, добавьте это значение и затем верните его. "
Edit : Как справедливо отметили другие, defaultdict
- лучший и более современный выбор. setdefault
по-прежнему полезен в более старых версиях Python (до 2.5).
На ваш вопрос уже был дан ответ, но IIRC вы можете заменить строки вроде:
if d.has_key(scope_item):
на:
if scope_item in d:
То есть d
ссылки d.keys ()
в этой конструкции. Иногда defaultdict
не лучший вариант (например, если вы хотите выполнить несколько строк кода после else
, связанного с вышеупомянутым if
), и Я считаю, что синтаксис в
легче читать.