Sencha Touch 2嵌套模型和数据存储

时间:2012-05-22 14:05:32

标签: sencha-touch extjs sencha-touch-2

我几乎不知道如何问这个问题,但是这里有。

我有两个模型,一个包含许多食谱的拼盘:

Ext.define('NC.model.Platter', {
  extend: 'Ext.data.Model',
  config: {
    fields: [
      { name: 'name', type: 'string' },
      { name: 'text', type: 'string' }
    ],
    associations: [
      {type: 'hasMany', model: 'NC.model.Recipe', name: 'recipes', filterProperty: 'text'}
    ]
  }
});

Ext.define('NC.model.Recipe', {
  extend: 'Ext.data.Model',
  config: {
      fields: [
        { name: 'name', type: 'string' },
        { name: 'image', type: 'string' },
        { name: 'stepsText', type: 'string', mapping: 'properties.preparationText' },
        { name: 'ingredientsText', type: 'string', mapping: 'properties.ingredientsText' }
      ]
    }
});

Platters基本上是在线食谱商店的不同过滤器。所以我可能有一千个食谱,但我的'Pizza'拼盘只会返回披萨配方(因此filterProperty)。 Platters只是在本地创建和存储,而Recipes是在线的。所以,商店:

Ext.define('NC.store.Platters', {
  extend: 'Ext.data.Store',

  config: {
    model: 'NC.model.Platter',
    storeId: 'Platters',
    proxy: {
      type: 'localstorage',
      id: 'platters'
    },
    data : [
        {name: 'Noodles', text: 'noodle'},
        {name: 'Baked', text: 'bake'},
        {name: 'Pizza', text: 'pizza'}
    ]
  }
});

Ext.define('NC.store.Recipes', {
  extend: 'Ext.data.Store',

  config: {
    model: 'NC.model.Recipe',
    storeId: 'Recipes',
    proxy: {
      type: 'jsonp',
      url: 'xxxx',  // url here (redacted)
      callbackKey: 'callback',
      filterParam: 'text',
      extraParams: {
        // credentials and tokens here (redacted)
      },
      reader: {
        type: 'json',
        idProperty: 'uuid',
      }
    }
  }
});

现在,我想创建一个数据视图的数据视图。 Platters列表,每个包含它的食谱列表:

Ext.define('NC.view.DiscoverGrid', {
  extend: 'Ext.DataView',
  xtype: 'discovergrid',
  id: 'discover',

config: {
    title: 'Discover',
    baseCls: '',
    useComponents: true,
    defaultType: 'platter',
    store: 'Platters',
    ui: 'light'
  }
});

Ext.define('NC.view.Platter', {
  extend: 'Ext.dataview.component.DataItem',
    xtype: 'platter',

  config: {
      layout: 'fit',
      height: '100px',
      list: {
        itemTpl: '{name}',
        inline: true,
        scrollable: {
          direction: 'horizontal',
          directionLock: true
        }
      },
      dataMap: {
        getList: {
          setData: 'recipes'
        }
      }
    },

    applyList: function(config) {
      return Ext.factory(config, Ext.DataView, this.getList());
    },

  updateList: function(newList, oldList) {
    if (newList) {
        this.add(newList);
      }

  if (oldList) {
        this.remove(oldList);
      }
    }
  });

现在,我如何填充拼盘的食谱?如果我使用一些内联配方数据填充Platters,那么:

data : [
    {name: 'Noodles', text: 'noodle', recipes: [
      { name: 'Pasta', ingredientsText: "Tomatoes\nPassata\n1tsp Oregano", preparationText: "Do something\nAdd passata\nmix in oregano and tomato",
        ingredients: [{ text: "bla"}]
      }
    ]},
    {name: 'Baked', text: 'bake'},
    {name: 'Pizza', text: 'pizza'}
]

...它直接运行并在其中呈现带有Pasta的数据视图。所以我只需要知道如何让我的拼盘填充他们的食谱数据。哪里(我在控制器中假设某种初始化事件)以及如何连接它?我正确使用filterProperty吗?我不完全理解这方面的文档,但我认为它通常会过滤掉我没有的外键,并且filterProperty会覆盖它。这样URL就会附加& text = noodle。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这当然似乎没有使用我认为Sencha Touch具有的关联和存储结构,但即使在进行到使recipes()关联正确加载之后,我也无法获得这样可以触发数据视图刷新。我花了太多时间在上面,所以我采用了不太优雅的解决方案。我将过滤器文本传递给Platter上的setter,它在param中使用此过滤器设置它的存储。它起码至少!

Ext.define('NC.view.PlatterDataItem', {
  extend: 'Ext.dataview.component.DataItem',
  xtype: 'platterdataitem',


  config: {
    layout: 'vbox',
    height: '130px',
    cls: 'platter',
    list: {
    },
    dataMap: {
      getList: {
        setRecipeFilters: 'text'
      }
    }
  },

  applyList: function(config) {
    return Ext.factory(config, NC.view.Platter, this.getList());
  },

  updateList: function(newList, oldList) {
    if (newList) {
      this.add(newList);
    }


    if (oldList) {
      this.remove(oldList);
    }
  }
});

Ext.define('NC.view.Platter', {
  extend: 'Ext.DataView',
  xtype: 'platter',


  config: {
    layout: 'vbox',
    height: '130px',
    itemCls: 'platter-item',
    itemTpl:  '<div class="thumb"><tpl if="image != null"><img src="{image}" /></tpl></div>'+
              '<div class="name">{name}</div>',
    inline: {
      wrap: false
    },
    scrollable: {
      direction: 'horizontal',
      directionLock: true
    }
  },

  setRecipeFilters: function(text) {
    var store = Ext.create('Ext.data.Store', {
      model: 'NC.model.Recipe',
      autoLoad: true,
      proxy: {
        type: 'jsonp',
        url: 'xxxxx',
        callbackKey: 'callback',
        extraParams: {
          // credentials & text filter param
        },
        reader: {
          type: 'json',
          idProperty: 'uuid',
        }
      }
    });

    this.setStore(store);
  }
});