pasar - manejo de archivos en javascript
No se puede ver el Tableviewrow mientras se hace clic en TableViewSection en la aplicación móvil de titanio (1)
He desarrollado una aplicación basada en la siguiente estructura de árbol:
Defecto :
- Categoría
- Categoría
- Categoría
Al hacer clic en la categoría:
- Categoría
- Subcategoría
- Producto
- Subcategoría
Categoría
Categoría
Algunas veces:
Categoría
Categoría
- Producto
Categoría
Aquí tengo que implementar este concepto utilizando la vista de tabla.
Sí, he creado la vista de tabla y luego he creado la sección tableviews. He agregado las categorías en la tablaviewsection.i he creado la vista de tabla dentro de la tableviewsection. Si he hecho clic en la categoría seleccionada, he agregado los valores de subcategoría en estos tableviewrow. Pero algunas categorías que tienen la subcategoría ... algunas de las categorías no tienen la subcategoría. Estrictamente tener los productos. Entonces, ¿pueden explicarme?
EDITAR:
Tengo el siguiente código:
// create menu view
var data = [];
var v1 = Ti.UI.createView({
height: ''100%'',
width: ''320dp'',
left: ''0%'',
backgroundColor: ''#212429''
});
$.drawermenu.drawermenuview.add(v1);
var tableView = Ti.UI.createTableView({
height: ''100%'',
width: ''100%'',
separatorColor: ''#111214'',
allowsSelection: true,
style: Ti.UI.iPhone.TableViewStyle.GROUPED
});
v1.add(tableView);
var dataArray = [];
getCategoryList();
function getCategoryList() {
var sendit = Ti.Network.createHTTPClient({
onerror: function(e) {
Ti.API.debug(e.error);
alert(''There was an error during the connection'');
},
timeout: 10000,
});
sendit.open(''GET'', url + ''android_livedev/client/xxx.php?action=allCategory&category=all'');
sendit.send();
sendit.onload = function() {
var response = JSON.parse(this.responseText);
if (response[0].success == 0) {
tableView.headerTitle = response[0].message;
} else {
tableView.headerTitle = "";
dataArray = [];
for (var i = 0; i < response[0].data.length; i++) {
var customsection = Ti.UI.createView({
width: Ti.UI.FILL,
height: Ti.UI.SIZE,
opened: true,
id: i,
categorylist_category_id: response[0].data[i].categoryid,
categorylist_level: response[0].data[i].category_level,
backgroundcolor: ''#fff'',
length: response[0].data.length,
});
var text = Ti.UI.createLabel({
text: response[0].data[i].category,
left: 20,
id: i,
categorylist_category_id: response[0].data[i].categoryid,
categorylist_level: response[0].data[i].category_level,
color: ''#000''
});
customsection.add(text);
row = Ti.UI.createTableViewSection({
headerView: customsection,
});
dataArray.push(row);
customsection.addEventListener(''click'', function(e) {
categorylist_category_id = e.source.categorylist_category_id;
categorylist_level = e.source.categorylist_level;
categorylist_id = e.source.id;
if (categorylist_level == "Y") {
var subcategory = [];
for (j = 0; j < response[0].data[categorylist_id].subcategorymm.length; j++) {
var subcategory = Ti.UI.createTableViewRow({
subcategorylist_category_id: response[0].data[categorylist_id].subcategorymm[j].categoryid,
layout: ''horizontal'',
top: 5,
width: "100%",
backgroundcolor: ''#000'',
height: Ti.UI.SIZE,
});
var subcategorytext = Ti.UI.createLabel({
text: response[0].data[categorylist_id].subcategorymm[j].category,
top: 5,
width: Ti.UI.FILL,
font: {
fontSize: ''18dp''
},
color: ''#040404'',
wordWrap: true,
height: Ti.UI.SIZE,
ellipsize: true
});
subcategory.add(subcategorytext);
};
row.add(subcategory);
} else {
from = "Product";
var product = Alloy.createController(''product'').getView();
product.open();
}
});
};
tableView.setData(dataArray);
};
};
}
var top10Screen = Alloy.createController(''top10Screen'').getView();
$.drawermenu.drawermainview.add(top10Screen);
Ti.App.addEventListener(''settingImg'', function(data) {
$.drawermenu.showhidemenu();
});
$.sample.open();
EDITAR:
Aquí se da el código de aleación:
sample.xml:
<Alloy>
<Window class="container">
<Require type="widget" src="com.drawermenu.widget" id="drawermenu"/>
</Window>
</Alloy>
Tengo que abrir las categorías en el menú deslizante. Así que tengo que usar estos widgets. Si hago clic en las categorías del menú del control deslizante, debo mostrar la subcategoría en el menú del control deslizante. Este es exactamente mi alcance.
este es exactamente mi json:
[
{
"message": "Category list found",
"data": [
{
"categoryid": "335",
"parentid": "0",
"category": "New In",
"description": "",
"meta_description": "",
"avail": "Y",
"order_by": "0",
"product_count": "2",
"top_product_count": "1",
"meta_keywords": "",
"override_child_meta": "N",
"title_tag": "",
"lpos": "1",
"rpos": "4",
"category_level": "Y",
"new_category_images": "https://dev101.example.com/xxx/images/C/newin.png",
"subcategorymm": [
{
"categoryid": "344",
"parentid": "335",
"category": "subcategory-newin",
"description": "",
"meta_description": "",
"avail": "Y",
"order_by": "0",
"product_count": "1",
"top_product_count": "1",
"meta_keywords": "",
"override_child_meta": "N",
"title_tag": "",
"lpos": "2",
"rpos": "3",
"category_level": "N"
}
]
},
{
"categoryid": "336",
"parentid": "0",
"category": "Women''s",
"description": "",
"meta_description": "",
"avail": "Y",
"order_by": "1",
"product_count": "2",
"top_product_count": "2",
"meta_keywords": "",
"override_child_meta": "N",
"title_tag": "",
"lpos": "5",
"rpos": "6",
"category_level": "N",
"new_category_images": "https://dev101.example.com/xxx/images/C/women.png"
}
],
"success": "1"
}
]
Aquí se enumeran las categorías. Pero si hago clic en la categoría, aparecerá la subcategoría. Pero no puedo ver la subcategoría. ¿Puedes consultar con esto y darme una solución?
EDITAR:
en este bucle for:
for(j=0;j<response[0].data[categorylist_id].subcategorymm.length;j++){
Tengo imprimir los valores como:
Ti.API.info(response[0].data[categorylist_id].subcategorymm[j].category);
esto significa que las subcategorías se imprimen bien en la ventana de mi consola. Pero no puedo ver la vista de tabla. Sé que cometí un pequeño error. Así que, ¿puedes descubrir el error y darme una solución?
Tu problema es real y tu código parece un poco desordenado. Te recomiendo que vayas por algo más estructurado si quieres evitar gastar HORAS para obtener el resultado deseado. Por ejemplo, intente dividir su código actual en múltiples funciones con un objetivo preciso.
Trataré de ayudar, usando algunos códigos que utilicé para mi menú de navegación de 2 niveles. La lógica es la misma, pero tendrás que agregar una tercera capa.
Menú de construcción
Supongo que en su xml, tiene un evento de escucha de TableView vacío para tocar (o hacer clic ) como este:
<TableView id="menuTable" onSingletap="onTap" />
Durante la inicialización, puede llamar a una función que agregará secciones vacías de primer nivel a su TableView.
Para agregar nuevas filas a estas secciones, defina _createRow
que crea, completa y devuelve un Ti.UI.createTableViewRow
dependiendo de su type
:
_createRow = function(data, type) {
var row = Ti.UI.createTableViewRow();
// populate row with some content here...
// Save some useful info in the row
row.listId = data.id;
row.subItems = data.subItems;
// What type of row are we creating ?
if (type === ''node'') {
// Category
row.isParent = true;
}
if (type === ''child'') {
// Customise row as a Product
row.backgroundColor = ''#2a2a2a'';
}
// There could be a third type for Sub-Category
return row;
};
Luego, dentro de cada sección que agrega una fila de node
, esta fila es una matriz que muestra la Categoría y guarda información como su identificación de categoría , su tipo y sus subelementos (usaremos esto más adelante).
Manejar clic evento (parte 1)
Si obtiene un evento de TableView, hay 3 casos posibles:
- Usuario pulsado Categoría -> mostrar / ocultar subcategoría
- Usuario hizo clic en Subcategoría -> mostrar / ocultar producto
- Usuario pulsado Producto -> Navegar a Producto
El código relacionado se encuentra al final de esta publicación, ya que primero explicaré cómo manejar estos casos.
Sección ''Abrir'' de la categoría
Si la Sección no se ha abierto ya, queremos mostrar lo que hay dentro. Definamos una función _openSection
que agregará una nueva sección justo después de la categoría en la que se hizo clic. Luego, agregue a esta Sección tantos elementos como subcategorías que tenga.
function _openSection(index, parentRow) {
newSection = Ti.UI.createTableViewSection({
index: parentRow.section.index + 1
});
_.each(parentRow.subItems, function(item) {
newSection.add(_createRow(item, ''child''));
});
parentRow.opened = true;
// Could be animated on iOS:
$.menuTable.insertSectionAfter(index, newSection);
// Save which Section is currently open
currentOpen = newSection;
};
''Cerrar'' sección de categoría
Lo mismo ocurre al revés: una sección ya abierta puede cerrarse grabándola. Simplemente eliminemos la sección seleccionada de TableView
.
_closeSection = function(index, parentRow) {
currentOpen = null;
parentRow.opened = false;
var removed = $.menuTable.sections[index].rows.length;
$.menuTable.deleteSection(index);
return removed;
};
Manejar evento click (parte 2)
Ahora tienes todo lo que necesitas para abrir y cerrar una categoría, aquí está el código para manejarlo:
_handleMenu = function(evt) {
var justify = false, openIndex;
// Clicked Section is already open
if (evt.row.opened) {
return _closeSection(evt.section.index + 1, evt.row);
} else {
/* Close currently opened Section, to have only one Category
* opened at the same time (simplifies the solution a lot)
*/
if (currentOpen) {
parentSection = $.menuTable.sections[currentOpen.index - 1];
parentRow = parentSection.rows[0];
if (currentOpen.index <= evt.section.index) {
justify = true;
}
removed = _closeSection(parentSection.index + 1, parentRow);
}
// Set the index we''ll be working with:
openIndex = evt.index;
// A Section was closed, change the index:
if (justify) {
openIndex -= removed;
}
// Workaround for parity on Android
if (OS_ANDROID) {
evt.row.section = evt.section;
}
return _openSection(openIndex, evt.row);
}
};
Intente que este código funcione con 2 capas, luego implemente la tercera capa faltante para alcanzar su objetivo.
No dudes en hacer preguntas si no estaba lo suficientemente claro;)
¡Buena suerte!