我一直在寻找更新Route模型的机制,并让Component(在与该路由相关联的模板内调用)对该事件作出反应,并重新渲染自身.

所以我有这样的索引模板(我传入了IndexController的模型,据我所知,它只是IndexRoute的代理 – 顺便说一句,我没有定义IndexController):

<script type="text/x-handlebars" id="index">
  Below is the bar-chart component
  <br/>
  {{bar-chart model=model}}
</script>

我有这样的组件模板:

<script type="text/x-handlebars" data-template-name="components/bar-chart">
</script>

我的组件是在一个单独的JS文件中实现的,如下所示:

App.BarChartComponent = Ember.Component.extend({
  classNames: ['chart'],model: null,chart: BarChart(),didInsertElement: function() {
    Ember.run.once(this,'update');
  },update: function() {
    var data = this.get('model').map(function(sales) {
      return sales.get('amount');
    });

    d3.select(this.$()[0]).selectAll('div.h-bar')
      .data(data)
      .call(this.get('chart'));
  }
});

BarChart()函数只返回一个函数对象,该对象执行DOM操作以使用D3生成图形.

我的IndexRoute定义如下:

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('sales');
  }
});

在这个实验中,我使用夹具:

App.Sales = DS.Model.extend({
  amount: DS.attr('number') 
});

idx = 1;

App.Sales.FIXTURES = [
  {id: idx++,amount: 2},{id: idx++,amount: 6},amount: 12},amount: 17},amount: 8}
];

我需要实现一个机制来定期轮询存储并更新Route的模型,并让EmberJS的魔法再次调用渲染函数(分配给BarChart组件中“chart”字段的值).

这样做的正确方法是什么?我一直在尝试使用setInterval并调用Route的refresh()方法,但到目前为止还没有成功.

谢谢你的帮助!,
拉嘎

添加(我在此处添加了我的附加注释以进行格式化).

我在app.js中添加了对setInterval的调用,如下所示:

setInterval(function () { 
  App.Sales.FIXTURES.shift();
  App.Sales.FIXTURES.push({
    id: idx++,amount: Math.round(Math.random() * 20)
  });

  App.IndexRoute.refresh();
},1500);

但我收到JavaScript错误,告诉我App.IndexRoute未定义.我打算在Route对象上调用’refresh’方法,因为我希望重新执行模型钩子.如何从setInterval函数获取对IndexRoute实例的引用?

这是触发刷新的正确/最佳方式,顺便说一下?

(并且,根据下面的Oliver的建议,我还在控制器中的’update’函数中添加了观察(‘model’).所以现在就是这样:

App.BarChartComponent = Ember.Component.extend({
  classNames: ['chart'],didInsertElement: function() {
    ...
  },update: function() {
    ...
  }.observes('model')
});

附加2(对EmberJS,polling,update route’s model,re-render component的回应)

得到它了!谢谢.

现在对于更新用例(后端中的元素数保持不变,id保持不变,只有“金额”随时间变化).我将setInterval块修改为:

setInterval(function () { 
  App.Sales.FIXTURES.forEach(function(elem) {
    elem.amount = elem.amount + 5;
  });

  console.log('z');
},1500);

现在的问题是,BarChartComponent中观察“model.@ each”的“update”方法永远不会被调用(好像我在BarChartComponent没有听到我在夹具元素中所做的更改).

我需要添加哪些指令?

附加3(详见EmberJS,re-render component):

我将IndexController的定义添加到我的代码中,只是为了确认我至少听到了对FIXTURE中元素的更改(它是).

所以,现在的问题是组件也能听到这种变化.怎么样?我应该从我的控制器调用一些“渲染”功能来要求组件重绘吗?

App.IndexController = Ember.ArrayController.extend({
  totalAmount: function() {
    console.log("iiii");
    var total = 0;
    this.forEach(function(sales) {
      console.log("a... " + sales.get('amount'));
      total += sales.get('amount');
    });
    return total;
  }.property('@each.amount')
});

解决方法

App.IndexRoute实际上是一个类定义,而不是一个实例.

对于您的特定情况,此处需要注意一些重要事项,find(‘type’)返回所有过滤器,当您从商店添加/删除项目时,该过滤器会自动更新.所以你可以在代码中的任何地方再次调用find(对于那种类型),它会自动更新你的集合.此外,您还希望控制路由级别的更新,这样您就不会在不在范围内时继续更新.

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('sales');
  },setupController: function(controller,model){
    this._super(controller,model); // do the default implementation since I'm overriding this func
    this.startRefreshing();
  },startRefreshing: function(){
    this.set('refreshing',true);
    Em.run.later(this,this.refresh,30000);
  },refresh: function(){
    if(!this.get('refreshing'))
      return;
    this.store.find('sales')
    Em.run.later(this,actions:{
    willTransition: function(){
      this.set('refreshing',false);
    }
  }
});

示例:http://emberjs.jsbin.com/OxIDiVU/825/edit

此外,对于组件,您需要观察数组,而不仅仅是模型本身(因为模型引用不会更新,这意味着不会调用观察方法).你会做这样的事情

watchingForModelChange: function(){

}.observes('model.[]')

ember.js – EmberJS,轮询,更新路线的模型,重新渲染组件的更多相关文章

  1. 基于HTML5 Canvas的3D动态Chart图表的示例

    这篇文章主要介绍了基于HTML5 Canvas的3D动态Chart图表的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 将PDF文件附加到电子邮件 – Swift

    我想发送带有PDF附件的电子邮件.我创建了PDF文件,然后我做了以下哪些错误我相信:在发送电子邮件之前,我可以看到附带的chart.pdf,但是当我发送电子邮件时,它是在没有附件的情况下发送的,这是因为我没有正确附加文件.解决方法您将错误的mimeType传递给addAttachmentData().使用application/pdf而不是pdf.

  3. mpandroidchart – 条形图中的y值变化动画

    在barChart上调用animateY时,将重绘整个图表,将条形图从y-zero设置为y-new.是否可以将动画限制为值更改.因此,允许用户看到图表如何从y-old增长到y-new?解决方法我遇到了同样的问题,无法找到解决方案.所以,我创建了一个可以调用来处理这种任务的类.你可以像这样调用这个类:

  4. 在MPAndroidChart库中禁用缩放缩放

    我想在MPAndroidChart库的barchart上禁用缩放缩放,我该怎么做.也不行.解决方法试试这个,disableallzooming:更多信息请参阅here

  5. 关于vue-tree-chart简单的使用

    这篇文章主要介绍了关于vue-tree-chart简单的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. .net-4.0 – Microsoft图表堆积柱形图存在差距

    我发现如果你在给定y值为0的值的最后给你的值添加点也不起作用–也就是在我保存图像之前.系列中点的顺序似乎很重要对于StackedColumn,我从来没有使用过这种类型,除了调查如何回答这个问题,这对于这类用户来说可能是常识)“after.png”的图片:那么,鉴于您无法在事后添加零点(尽管您可以插入它们?

  7. 在php mysql中使用Google Chart API显示条形图

    我一直在搜索很多这个.我得到了解决方案.这里是.这是使用AJAX在PHP中完成的.我有2页是googleapi.PHP和其他getData.PHP,由googleapi.PHP发送的AJAX请求使用.googleapi.PHP访问getdata.PHP就是这样,你需要创建一个数据库.它的作用就像一个魅力.我知道你的帖子是一个“答案”,但我认为我会进来的.如果你想要动态地输入数据到Google图表中,你可以使用PHP回调到javascript中.PHP可用于从您的服务器或MysqL表中获取信息.这是一个例子

  8. 正则表达式匹配月份名称,后跟年份

    例如,可以使用正则表达式来匹配“2009年2月”吗?

  9. 异步 – 没有Ember Data的AJAX承诺

    我决定不使用余烬数据,因为它不是准备就绪并且仍在变化。我的应用程序只需要做一些ajax请求,所以它不应该太大的区别。我无法理解如何处理ajaxpromise响应。我正在尝试ping该用户信息的服务器并将其显示在我的模板中。看来我的模板是在我的ajax请求返回结果之前呈现的,然后不会用承诺进行更新。所以通常的规则是总是返回一个使Ember能够执行其逻辑的对象。您的案例中首先不会显示任何值,一旦您的对象被填充,Ember将启动它的魔法并自动更新您的模板。

  10. 使用Ajax将数据加载到Highcharts中

    我试图在页面加载和使用JQUERYAJAX调用选择菜单更改时更新高级图表.在[[10,1228800000],[10,1228800000]]格式中返回数据.该图表为空白,不显示任何数据.试过这里发布的几个解决方案,但都没有奏效.有错误吗?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部