Tenía una declaración foreach y usé afterRender para llamar a la función.
<div data-bind="foreach: { data: Object.keys(pricings()), as: '_propkey', afterRender: pricingTableRenderedHandler }">Durante esta iteración, _propkey era una sola cadena. Luego tuve que cambiar la instrucción foreach a esto:
<div data-bind="foreach: { data: pricings(), as: '_propertykey', afterRender: pricingTableRenderedHandler}"> <div data-bind="foreach: { data: _propertykey.states, as: '_secondarypropkey'}">función de controlador
self.pricingTableRenderedHandler = function (data, stateName) { var tableSelector = "#" + stateName.states.state.replace(/\s/g, ''); hideEmptyTableColumns.hide(tableSelector); replaceEmptyTableCells.replaceBy(self.emptyCellValue, tableSelector); }En el caso de foreach antiguo, recibió una cadena en el parámetro stateName. Ahora, recibe un objeto que se ve así.
[ "cropYear" : "2020" "states": [ { "state": "Tbilisi", "details": { "PriceHeaders": [ ], "Comment": "TBi", "Pricings": [ ] } } { "state": "Texas", "details": { "PriceHeaders": [ ], "Comment": "dasdsa", "Pricings": [ ] } } ]]
Solo necesito tomar el valor de la propiedad "estado". Supongo que necesito llamar a la función del controlador en foreach interno, pero por alguna razón, no puedo. A menos que esté escrito en el primer foreach, no se llama.
El enlace foreach crea un nuevo contexto de enlace para cada elemento. Si, dentro de la plantilla que pasa a foreach , necesita acceder a una propiedad del contexto original, puede acceder usando $parent .
<div data-bind="foreach: { data: pricings(), as: '_propertykey' }"> <div data-bind="foreach: { data: _propertykey.states, as: '_secondarypropkey'}, afterRender: $parent.pricingTableRenderedHandler"> <!-- ^^^^^^^^ --> </div> </div> Tenga en cuenta que la función se llamará con el elemento actual ( $data ) como this . Si su controlador se basa en this , puede usar $parent.methodName.bind($parent) .