Как я могу получить доступ к родительской переменной из дочернего массива с помощью knockout js

Я использую нокаут и имею массив «Свойства», и каждое «Свойство» может иметь дочерние «свойства».

все в порядке, за исключением того, что есть свойство массива «TabID», которое должно быть унаследовано - например, если оно изменено в родительском «Свойстве», оно также должно измениться в дочернем «Свойстве»

Я попытался заставить это работать, используя создание вычисляемого, например.

this.TabID = ko.computed(function(){
return $parent.TabID();
});

а затем понял, что $ parent доступен только в цикле foreach

Я также пробовал передать родительский элемент в конструктор, например

var childproperty = function(parent,[other properties]){
this.TabID = ko.computed(function(){
return parent.TabID(); // OR return parent.TabID;
}

может кто-нибудь указать мне в правильном направлении, пожалуйста? В качестве побочного примечания мне также нужно иметь доступ к родительскому элементу для вычисления [i] на основе нуля.

то есть каждое родительское свойство должно быть properties [i] .propitem, где i = вычисленное значение на основе каждого родителя + их дочерние свойства

например: если родительское свойство 1 имеет 3 дочерних свойства, тогда родительское свойство 1 должно быть i = 0, дочерние свойства (i = 1,2,3), а затем родительское свойство 2 будет иметь «i» 4

Я знаю ... Я не прошу многого, я не жду идеального решения моих проблем, но если кто-то может хотя бы указать мне правильное направление, я был бы очень благодарен.

Ваше здоровье.


person Brett Smith    schedule 12.06.2012    source источник


Ответы (1)


Мне удалось заставить это работать, используя следующее, надеюсь, это поможет кому-нибудь еще, испытывающему ту же проблему.

var childproperty = function(parent,[other properties]){
this.parent = ko.observable(parent);
this.TabID = ko.computed(function(){
return this.parent().TabID(); // OR return parent.TabID;
}

Я также заметил, что, поскольку мой родитель вызывал добавление дочернего элемента из функции, я не мог просто использовать "this"

моя родительская собственность сейчас

var parentproperty = function([properties]){
var p = this;
p.childproperties = ko.observableArray();
p.TabId = ko.observable(1);
p.addChild = function(){
p.childproperties.push(new childproperty(p,[other properties]));
}

это работает отлично - если родительский tabid изменяется, значение отражается дочерним свойством. Мне действительно нужен был только родительский индекс внутри цикла foreach, к которому я обращался с помощью $ parentContext. $ Index ()

person Brett Smith    schedule 13.06.2012
comment
Не могли бы вы просто передать родителя так: ‹div foreach = items› ‹child data-bind = click: Foo ($ parent) - person Nikos; 05.03.2013
comment
@Nikos - нет, потому что если вы это сделаете, Foo($parent) будет выполняться во время привязки, вам нужно установить click для делегата. - person Josh M.; 24.06.2013