Получение данных Ractive по, скажем, "id", а не по индексу объекта

Скажем, мои данные Ractive выглядят так:

items: [
  { id: 16, name: "thingy" },
  { id: 23, name: "other thingy"}
]

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

ractive.get('items.0')

Но как мне получить (или удалить, или обновить, в этом отношении) элемент с идентификатором 23?

2 ответа

Решение

В основном проблема с javascript, но вы можете поместить методы в свой ractive экземпляр или в прототип вообще. Предполагая, что ваш массив не слишком велик и используя find и findIndex, вы можете сделать что-то вроде:

Ractive.prototype.getIndexById = function(keypath, id){
    this.get(keypath).findIndex(function(each){
        return each.id === id;
    });
}

Ractive.prototype.getById = function(keypath, id){
    return this.get(keypath).find(function(each){
        return each.id === id;
    });
}

Ractive.prototype.delete = function(keypath, id){
    return this.splice(keypath, this.getIndexById(id), 1);
}

Ractive.prototype.update = function(keypath, id, data){
    return this.set(keypath + '.' + this.getIndexById(id), data);
}

Но если вы просто пытаетесь получить дескриптор элемента, из которого произошло действие, вы должны использовать контекст:

{{#items:i}}
<li on-click='selected'>{{name}}</li>
<!-- or -->
<li on-click='selected(this, i)'>{{name}}</li>
{{/items}}

в вашем коде

new Ractive({
    ...
    selected: function(item, index){
        // in lieu of passing in, you can access via this.event:
        var item = this.event.context // current array member
        var index = this.event.index.i // current index
    },
    oninit: function(){
        this.on('selected', function(){
            // same as method above
        }
    }

Если вы хотите использовать jQuery, это можно сделать так:

Ractive.prototype.getKeyById = function(keypath, id) {
  var key;
  key = -1;
  $.each(this.get(keypath), function(i, data) {
    if (data.id === id) {
      key = i;
      return false;
    }
  });
  return key;
};
Другие вопросы по тегам