【问题标题】:EmberJS View programmatically using a not loaded modelEmberJS 使用未加载的模型以编程方式查看
【发布时间】:2013-10-12 07:28:06
【问题描述】:

我有一个模型:

App.Checkin = DS.Model.extend({
  latitude: DS.attr('string'),
  longitude: DS.attr('string'),
  time: DS.attr('number')
});

以及一个通过

加载签入模型集合(使用 ember-data 发出请求)的路由
model: function() {      
  return this.store.find('checkin');
}

然后在我的路线模板中

{{view App.MapView}}

而且我需要以编程方式访问模型,以便我可以遍历模型中的每个项目以将图钉添加到地图。

在我的视野中

didInsertElement: function() {
   var data = this.get("context.content");
}

数据是

Class {type: function, store: Class, isLoaded: true, isUpdating: true, toString: function…}

在网络窗口中,此时对服务器的请求还没有完成,所以它显然没有数据要提供。 (即使是这样,我也不知道如何查询这样的对象,预期的方法都不起作用(get/forEach))

我相信我需要观察正在改变的模型,并且已经尝试过

updatePins: function() {
  debugger;
}.observes('context.content')

在视图内部。我尝试绑定到各种东西,但从未调用过 reRender。我已经尝试了Emberjs view binding for Google maps markers 上的建议 通过尝试绑定到 controller.content、context、App.Checkin 等。

一旦模型加载...在视图内部,我该如何从模型中获取数据?

【问题讨论】:

    标签: google-maps-api-3 ember.js ember-data


    【解决方案1】:

    直到模型没有解决你得到的是对该模型的承诺,显然承诺不包含数据,但是当请求从服务器返回时。如果模型有数据,您可以检查您的模板,通过观察model.length 属性,例如使用if 助手,当length 属性更改此蜜蜂时,if 助手块将重新评估它有收到数据。

    例如,您可以尝试这样的操作:

    ...
    {{#if model.length}}
      {{view App.MapView}}
    {{/if}}
    ...
    

    这将确保您的 App.MapView 在您的模型有数据时被渲染,因此您也可以按预期访问视图的 didInsertElement 挂钩中的数据。

    更新

    你的reRender钩子名字有点不对,应该是rerender

    rerender: function() {
      debugger;
    }.observes('context.content')
    

    希望对你有帮助。

    【讨论】:

    • 所以,这似乎可行,但我认为它会导致一些性能问题。如果在模型加载之前不渲染视图,则无法尽早加载 dom,并且在模型加载时会出现回流。理想情况下,地图会立即显示,并且在加载模型时会显示图钉。此外,即使模型已加载但服务器有 0 个项目,这是否有效?这似乎确实让 didInsertElement 有一个加载的模型,但是 this.get("context.model").toArray()[0].latitude 存在,但未定义(它为路线正确渲染)
    • 公平地说,你仍然可以坚持你的 rerender 方法,它从未被调用的原因是因为你命名钩子略有错误,而不是 reRender 它应该是 rerender all小盒
    • 感谢您到目前为止的帮助,我很感谢您在这方面帮助我,我整天都被卡住了。我不认为将其更改为重新渲染是解决方法。我相信这是视图挂钩的名称,但这与问题无关。该函数的更好名称可能是 updatePins(我更改了原始帖子),因为我想在模型更改时重做地图上的引脚,所以我需要观察模型的变化。即使那样,它仍然不会在 context.content 或 context.model 上触发
    猜你喜欢
    • 2010-11-05
    • 2014-12-02
    • 1970-01-01
    • 2021-07-03
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多