तो निम्न दस्तावेज़ों से https://www.polymer-project.org/1.0/docs/devguide/properties.html#deep-sub-property-changes-on-array-items

मैंने निम्नलिखित कोड बनाया:

            properties:{
                skills:{
                    type:Array,
                    notify: true,
                    value: [
                        {
                          id:1,
                          name:"UNOOOOOO",
                          description: "aaa a a aa a aaaa adicionales con el fin de exceder sus expectativas y "+
                          "mejorar su calidad de vida. La orientación al "+
                          "cliente es una actitud permanente  que caracteriza a la persona."
                        },
                        {
                          id:2,
                          name:"Capacidad para plantear identificar y resolver problemas",
                          description: "aaa a a aa a aaaa adicionales con el fin de exceder sus expectativas y "+
                          "mejorar su calidad de vida. La orientación al "+
                          "cliente es una actitud permanente  que caracteriza a la persona."
                        }
                    ]
                }
            },
            observers: [
                'skillIsSelectedChanged(skills.*)'
            ],
            skillIsSelectedChanged: function(changeRecord){
                console.log(changeRecord);
            }

मैं डेटा बाध्यकारी अद्यतन के माध्यम से कॉलबैक प्राप्त करने में सक्षम हूँ। :डी

Object {path: "skills.#0.isSelected", value: true, base: Array[2]}

मेरा प्रश्न है: क्या #0 द्वारा संदर्भित वस्तु की 'आईडी' प्राप्त करने का कोई साफ तरीका है?

मेरा मतलब है कि मैं स्ट्रिंग का विश्लेषण करने और '0' प्राप्त करने के लिए कुछ कर सकता हूं, फिर इसे एक पूर्णांक में परिवर्तित कर सकता हूं और फिर ऑब्जेक्ट आईडी इस तरह प्राप्त कर सकता हूं:

this.skills[varWith0].id

लेकिन यह सही साफ तरीका नहीं लगता है। मुझे यह भी लगता है कि ऐसा करना एक सामान्य बात होगी।

तो क्या ऐसा करने का कोई साफ तरीका है?

शुक्रिया

1
Alejandro 21 मार्च 2016, 06:53

2 जवाब

सबसे बढ़िया उत्तर

ठीक है.. मैंने समस्या को हल करने के लिए अपना कोड लिखने का फैसला किया। जैसा कि मैंने कहा, मुझे लगता है कि इसे करने का कोई स्टार तरीका होना चाहिए। बहरहाल यह भी काम करता है।

            skillIsSelectedChanged: function(changeRecord){
                //primero tenemos que obtener la posicion del skill que cambio.
                //path nos da un string asi: skills.#0.isSelected donde el 0 despues del # es la posicion.
                //por otro lado cuando se cargan los elementos inicialmente tambien llama este callback
                //pero con un string en path asi: skills

                //primero hacemos split en #.
                var arr = changeRecord.path.split("#");

                //luego si el length del arreglo es mayor a 1 estamos en el caso que nos interesa.
                if(arr.length > 1){
                    //como desconocemos el largo del numero, le volvemos e hacer un split al arr[1] en '.'
                    //de ese segundo arreglo resultante, la posicion 0 es el numero deseado. Ese lo convertimos en int
                    var arr2 = arr[1].split(".");
                    var position = parseInt(arr2);

                    //finalmente buscamos en skills el id del objeto en la posicion obtenida
                    var id = this.skills[position].id;

                    //lo metemos en el arreglo de respuesta
                    this.responseSkills.push(id);
                }
            }

मुझे पता है कि टिप्पणियां स्पेनिश में हैं (इसके बारे में खेद है) लेकिन जो लोग स्पेनिश नहीं समझते हैं उनके लिए कोड बहुत आसान है। आशा है ये मदद करेगा

0
Alejandro 22 मार्च 2016, 03:30

तत्व के प्रोटोटाइप पर एक get विधि है जिसका उपयोग पथ द्वारा मान प्राप्त करने के लिए किया जा सकता है। तो यदि आपके पास पथ है, तो आप मान पुनर्प्राप्त कर सकते हैं।

if (changeRecord.path.indexOf('.isSelected') >= 0) {
  var itemPath = changeRecord.path.replace('.isSelected', '');
  var item = this.get(itemPath);
}

यह जानना भी आसान है कि आप पथ को पथ या पथ खंडों की एक सरणी के रूप में पारित कर सकते हैं, ताकि आप यह भी कर सकें:

var parts = changeRecord.path.split('.');
var last = parts.pop();
if (/* last is something interesting */) {
  var item = this.get(parts);
}

यदि आप सुनिश्चित करना चाहते हैं कि डेटा बाइंडिंग और ऑब्जर्वर अपडेट हों, तो आप अपने responseSkills एरे को अपडेट करने के लिए this.push और this.splice का भी उपयोग करना चाहेंगे, इसलिए एंड कोड कुछ इस तरह दिख सकता है:

if (changeRecord.path.indexOf('.isSelected') >= 0) {
  var itemPath = changeRecord.path.replace('.isSelected', '.id');
  var id = this.get(itemPath);
  if (changeRecord.value) {
    this.push('responseSkills', id);
  } else {
    for (var i=0; i<this.responseSkills.length; i++) {
      if (this.responseSkills[i] == id) {
        this.splice('responseSkills', i, 1);
        break;
      }
    }
  }
}
1
DocDude 7 अप्रैल 2016, 02:34