【问题标题】:Ember: Accessing a data store in an Ember componentEmber:访问 Ember 组件中的数据存储
【发布时间】:2015-04-10 17:06:36
【问题描述】:

我也有想要提供数据的组件。如果有帮助,我正在使用 Ember-CLI。

该组件是一个地图,我正在加载到我不想在其上放置标记的页面上。我使用了一个组件,因此我可以使用 didInsertElement 方法在元素准备好后访问它。

export default Ember.Component.extend({
    componentMap: '',
    didInsertElement: function() {
        navigator.geolocation.getCurrentPosition(position => {
            //Initialize map...
            this.populateMap();
        });
    },
    populateMap: function() {
        //Get store
        var store = this.get('parentView.targetObject.store');
        console.log(store);
        //Search Store
        var data = store.find('restaurant');
        //Where is the data?!
        data.map(item => {
            console.log(item.get('name'));
        });
    }
});

我在从商店获取数据时遇到问题。我见过几种方法,here 显示了两种不同的方法。首先是this.get('parentView.targetObject.store')this.get('targetObject.store')。我也尝试过{{component store=store}} 方法,但这对我也不起作用。这可能与对 ember 应用程序中的数据流缺乏了解有关。

我正在使用 Ember CLI,我想知道它是否与模块内部 this 的上下文有关?

如果我不知道该怎么做,请告诉他们!

更新:为上下文添加路由、控制器和模板。

路线

export default Ember.Route.extend({
    model: function() {
        return this.store.find('restaurant');
    }
});

控制器

export default Ember.Controller.extend({
    actions: {
        add: function() {
            var $addForm = $('.add-form');
            $addForm.show();
        }
    }
});

模板(index.hbs,在application.hbs中输出{{outlet}}

{{main-map store=store}}

谢谢。

【问题讨论】:

  • 如您所述,解决此问题的正确方法是使用{{component store=store}}。组件不应直接访问商店。当您采用这种方法时,您尝试了什么?
  • @Oren 我使用的是var data = this.get('store').find('restaurant',1');,其中餐厅是我的模型。但是,如果我随后执行data.get('name') 之类的操作,它将返回未定义。我该如何处理?
  • 首先您可以使用 ember inspector 来确认您的控制器可以按预期访问存储并且存储包含您期望的数据吗?
  • @Oren 我不能 100% 确定如何检查,我可以在数据选项卡中看到数据。我拥有的控制器是ApplicationController,如果我选择查看树并且在该控制器的模型部分中有一个<DS.RecordArray....>,右侧栏有一个Ember.ArrayProxy,其中有我的项目。这似乎不太正确......这有帮助吗?非常感谢。
  • 我需要查看您的路由和控制器中的代码以便更好地提供建议,但至少您正在提取数据:)

标签: ember.js ember-data ember-cli


【解决方案1】:

发生的事情如下:

与您的控件关联的模型填充为一组餐馆,而不是单个地图或任何类似的东西。

return this.store.find('restaurant'); 从商店返回一系列餐馆,最终填充控制器的模型。

如果您想在组件中访问模型中包含的数据,则应将模型作为参数传递给组件。

因此,您可以按如下方式传递餐厅数组(根据需要重命名属性):

{{main-map data=model}}

或者,如果理论上您想为每个 restaurant 显示一个组件:

{{#each restaurant in model}}
  {{your-component name=restuarant.name}}
{{/each}}

【讨论】:

  • 非常感谢。这行得通。我的解决方案是到var store = this.get('data');,然后我可以对其进行迭代。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多