multidimensional array in javascript flowchart

vasilev

Registered
здравейте,
трябва ми малко помощ.

datau['properties']['inputs']['input_0']['label'] = "DEMO2";
аlert(datau.toSource());

как може да стане това ? :)

след JSON.stringify :

{properties:{inputs:{input_0:{label:"Input 1"}}}


мерси
 
{properties:{inputs:{input_0:{label:"Input 1"}}}}

Това винаги можеш да го използваш по първия начин:

Обектно:
[js]
obj.properties.inputs.input_0.label
[/js]

Като масив:
[js]
obj['properties']['inputs']['input_0']['label']
[/js]

И двата случая ще работят, но не го минавай със stringify. Функцията се използва, ако искаш да пренесеш обекта някъде в низ и след това пак да си го преобразуваш в обект.
 
.. така става но много код :)

$(document).ready(function() {
var obj={};
var obj2={};
оbj['properties']="test";
obj2['test2']=obj;
alert(obj2.toSource());
...
 
http://sebastien.drouyer.com/jquery.flowchart-demo/

Това ли ползваш? Ако е така си на съвсем грешен път.

flowchart метода изисква обект, в който на ключ data да подадеш нужните данни.
Дай някъде по-надолу View Source и виж структурата на обектите.

JavaScript не обича да работи с масиви. Езика е обектно-ориентиран(сбъркана представа за обектно-ориентиран) и работи главно с обекти. Масивите(което реално се нарича масив) в JavaScript нямат ключове, а само стойности. Многомерен масив се постига само с обекти.

И това new array() трябва да го махнеш. Едно че си го написал грешно, второ - работи с обекти.

[js]
var obj = {};

// или

var obj = new Object();
[/js]

Като първия е за предпочитане.
 
.. промених си отговора :)
да сега го направих така:

var label={};
var input_0={};
var inputs={};
var properties={};
var operators={};
label['label']="DEMO2";
input_0['input_0']=label;
inputs['inputs']=input_0;
properties['properties']=inputs;
operators['operators']=properties;


$flowchart.flowchart('setOperatorData', selectedOperatorId, operators);

но не го променя , не намирам каква точно иска да е датата вътре..
 
vasilev каза:
.. промених си отговора :)
да сега го направих така:

var label={};
var input_0={};
var inputs={};
var properties={};
var operators={};
label['label']="DEMO2";
input_0['input_0']=label;
inputs['inputs']=input_0;
properties['properties']=inputs;
operators['operators']=properties;


$flowchart.flowchart('setOperatorData', selectedOperatorId, operators);

но не го променя , не намирам каква точно иска да е датата вътре..

Отвори пак линка и виж как са структурирани там и какво се подава на flowchart(). И с това омешване обекти-масиви накрая ще се омажеш яко.
 
това се подава на setData :

Код:
{
  "operators": {
    "operator1": {
      "top": 20,
      "left": 20,
      "properties": {
        "title": "Operator 1",
        "inputs": {},
        "outputs": {
          "output_1": {
            "label": "Output 1"
          }
        }
      }
   ....
...

}

но на мен ми трябва само setOperatorData. тук не съм сигурен какво се подава. не мога да подам всичко а само input/output чиито имена искам да променя..

може би е по добре да сложа повече код.
това намерих след като дръпнах ultiflow Което той е разработил:

* __setOperatorData(operatorId, operatorData):__
* __Description:__ This method replaces the operator's data. Note that if new connectors are renamed / removed, the flowchart can remove links.
* __Parameters:__
* __operatorId__
* __operatorData__: Same as in `data.operators`.

така обхождам input/output :

[js]var arrinputs=$flowchart.flowchart('getOperatorData', operatorId).properties.inputs;
var arroutputs=$flowchart.flowchart('getOperatorData', operatorId).properties.outputs;
$.each(arrinputs, function (index, value) {
$( $("#inout") ).append( '<div class="form-group"><label for="operator_title">Groups '+index+': </label><input type="text" id="'+index+'" class="form-control grinputs" value="'+value.label+'"/></div>' );
});
$.each(arroutputs, function (index, value) {
$( $("#inout") ).append( '<div class="form-group"><label for="operator_title">Groups '+index+': </label><input type="text" id="'+index+'" class="form-control groutputs" value="'+value.label+'"/></div>' );
});[/js]


след което трябва да взема данните..

[js]$(".grclose").click( function(){
var selectedOperatorId = $flowchart.flowchart('getSelectedOperatorId');
$('.grinputs').each(
function(index){

// alert($(this).val());
//alert($(this).attr('id'));
}
);[/js]


тук ще ги добавя към масива на мястото на алерт просто исках да видя че работи.
но сетването е проблема..
 
Или говорим за различни плъгини или нещо не можем да се разберем. Дай да видя кой точно плъгин използваш, за да не говорим празни приказки.
 
Да опитам да разясня.

Това, което подаваш в flowchart() метода е грешно.

Да вземем тези данни:

[js]
var data = {
"operators": {
"operator1": {
"top": 20,
"left": 20,
"properties": {
"title": "Operator 1",
"inputs": {},
"outputs": {
"output_1": {
"label": "Output 1"
}
}
}
....
...

}
[/js]

[js]
var flowchart = $flowchart.flowchart({
data: data;
});

// или

var flowchart = $flowchart.flowchart();
// Това не съм сигурен дали ще сработи преди
// следващия пример отдолу
flowchart.setOperatorData('operator1', { /** тука слагаш данните за оператор1 **/ });

// следващ пример
var flowchart = $flowchart.flowchart();
flowchart.createOperator('operator1', { ...data });
[/js]

Нещо такова се прави.
 
за същото говорим.
така го е написал той в demo-то.. за title:

[js]$GroupTitle.keyup(function() {
var selectedOperatorId = $flowchart.flowchart('getSelectedOperatorId');
if (selectedOperatorId != null) {
$flowchart.flowchart('setOperatorTitle', selectedOperatorId, $GroupTitle.val());
}
});[/js]

аз се опитвам да променя един input с id - input_0:

[js]var label={};
var input_0={};
var inputs={};
var properties={};
var operators={};
label["label"]="DEMO2";
input_0['input_0']=label;
inputs['inputs']=input_0;
properties['properties']=inputs;
operators['operators']=properties;

//$flowchart.flowchart('setOperatorData', selectedOperatorId, operators);
//и така опитвам и следващото, няма резултат
$flowchart.flowchart.setOperatorData(selectedOperatorId, operators);

[/js]

но title е текст докато data си е array.. въпросът е какво точно да се подаде за да смени имената..
 
Ако продължаваш така да си пишеш нещата, никога няма да стигнеш до извод. Проблема е, че объркваш и мен, макар че все пак виждам грешки.

Между другото, по-скапано написана библиотека не бях виждал.

[js]
var operatorData = $flowchart.flowchart('getOperatorData', selectedOperatorId);
operatorData.properties.inputs.input_0.label = "NEW LABEL";

$flowchart.flowchart('setOperatorData', selectedOperatorId, operatorData);
[/js]

Опитай така.
 
разбрах .. първо да се вземат обектите и след това да се сменят..
ок е сега, мерси !

има много други библиотеки но тази е що годе добра и безплатна..
 
vasilev каза:
разбрах .. първо да се вземат обектите и след това да се сменят..
ок е сега, мерси !

има много други библиотеки но тази е що годе добра и безплатна..

Ами по принцип нещата винаги така работят. Ако съществуват данните, трябва първо да ги вземеш, след това да ги обработиш и да ги запишеш отново.

Представи си работата с базата данни. Преди да промениш данни, ги взимаш първо. Дори UPDATE-SET прави първо един вид SELECT преди да промени данните.
 

Горе