ember 中可重用对象的架构

2024-04-07

我正在使用 ember 构建一个管理仪表板。我想创建一个可重用的图表对象,我可以在整个应用程序中拥有多个实例。图表对象应该有一个由一些标记和一个画布元素组成的模板,在插入 DOM 后我需要其 id 以便附加实际的图表 (chart.js)。我尝试了几种方法,但我似乎无法找出执行此操作的正确架构。

Ember 中实现上述目标的正确架构是什么?

Thanks!


Ember.Component http://emberjs.com/api/classes/Ember.Component.html是你的朋友

正如 @raulbrito 已经提到的,如果你想要 ember 中的可重用组件,最好的方法确实是使用新的Ember.Component这在很大程度上基于Web 组件的新 w3 草案 http://www.w3.org/TR/2013/WD-components-intro-20130606/从而成为未来的证明。

我试图举一个简单的例子来说明如何实现这一点。 给定一个简单的route哪里的model钩子返回一些静态数据:

索引路线

App.IndexRoute = Ember.Route.extend({
  model: function(){
    return Ember.Object.create({
      modelOne: data,
      modelTwo: data2
    });
  }
});

data and data2为简单起见,只是全局定义的静态对象(正如你将看到的在演示中 http://jsbin.com/odosoy/146/edit),但这也可能是来自后端或固定装置等的数据。

索引模板

在模板中,我们插入带有线条的图表组件{{line-chart data=model.modelOne}}正如你所看到的,我们还设置了data索引模型的属性model.modelOne or model.modelTwo:

<script type="text/x-handlebars" id="index">
  <h2>Chart one</h2>
  {{line-chart data=model.modelOne}}

  <h2>Chart two</h2>
  {{line-chart data=model.modelTwo}}
</script>

组件模板

我们的组件模板看起来相当简单,因为它将呈现一个简单的canvas元素,但它可以根据需要而复杂,关于如何使用Ember.Component另请参阅docs http://emberjs.com/guides/components/:

<script type="text/x-handlebars" id="components/line-chart">
</script>

组件子类

App.LineChartComponent = Ember.Component.extend({
  tagName: 'canvas',
  attributeBindings: ['width', 'height'],
  width: '480',
  height: '360',
  data: null,
  didInsertElement: function() {
    var ctx = this.get('element').getContext("2d");
    var myNewChart = new Chart(ctx).Line(this.get('data'));
  }
});

请注意,命名在这里很重要,Ember 根据名称知道哪个子类为组件提供支持。例如,如果您有一个名为line-chart,您将创建一个名为的子类App.LineChartComponent。如果你的组件被调用bar-chart-simple,类名是App.BarChartSimpleComponent等等。 Ember 将查找具有组件的驼峰名称的类,然后是Component.

所以,自从Ember.Component延伸自Ember.View我们可以定义各种属性Ember.View支持喜欢tagName。在我们的例子中,我们使用canvas因为这就是chart.js需要工作。正如你所看到的,我们还定义了一些attributeBindings来控制width and height of the canvas从余烬内部。该组件还有一个data属性(可以随意称呼)定义我们稍后在从返回的模板中设置模型数据IndexRoute model钩。最后在你的didInsertElement我们组件的钩子我们初始化图表传递this.get('data')新创建的数据对象Chart.js class.

var ctx = this.get('element').getContext("2d");
var myNewChart = new Chart(ctx).Line(this.get('data'));

最后但并非最不重要的一点是,请参阅此处工作示例 http://jsbin.com/odosoy/146/edit以上的解释。

希望能帮助到你。

更新以回应您的最新评论

我试图模拟分辨率的延迟model钩子来模仿后端的响应,正如您所看到的,模板渲染正在等待model承诺先解决。基本上我所做的是使用Ember.run.later延迟 2000 毫秒,一旦超时即可解决承诺:

App.IndexRoute = Ember.Route.extend({
  model: function(){
    return new Ember.RSVP.Promise(function(resolve) {
      Ember.run.later(function() {
        var m = Ember.Object.create({
          modelOne: data,
          modelTwo: data2
        });
        resolve(m);
      }, 2000);
    });
  }
});

只是为了好玩我还添加了一个LoadingRoute在承诺解析等待数据时显示旋转器,LoadingRoute是 ember 的一个记录较少的功能,您可以在这里阅读更多相关信息:https://gist.github.com/machty/5647589 https://gist.github.com/machty/5647589 under 如何在带有 Promise 的转换过程中设置(全局)加载微调器?

请参阅此处的更新示例:http://jsbin.com/odosoy/145/edit http://jsbin.com/odosoy/145/edit

更新响应 @SamSelikoff 的评论

至于上面提到的LoadingRoute@SamSelikoff 指出现在已正式记录:http://emberjs.com/guides/routing/defining-your-routes/#toc_initial-routes http://emberjs.com/guides/routing/defining-your-routes/#toc_initial-routes

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ember 中可重用对象的架构 的相关文章

  • 子目录中的 Ember 组件

    我读到现在支持在 components 中包含目录 文件夹 使用 ember cli 我可以生成所需的必要子目录 组件 但是 我似乎无法引用该组件 例如 如果我有这样的文件夹结构 app components sub test comp j
  • Ember CLI 在生产中失败

    我正在通过 jenkins 部署 Ember CLI 应用程序并使用 nginx 发布它 这是詹金斯构建脚本 npm install bower install node modules ember cli bin ember build
  • 使用 jasmine 测试 ember.js 应用程序

    有谁知道有关测试 ember js 应用程序的任何资源 示例或教程 您如何测试视图 似乎没有任何关于此的广泛示例 信息 我无法提出一个如何实现这一目标的示例 但我发现了一个广泛使用 Jasmine 进行测试的项目 您应该看一下余烬资源 ht
  • EmberJS/HandlebarsJS 的自定义 for 循环助手

    两个小时前我开始 嵌套 HandlebarsJS each 助手与 EmberJS 不起作用 https stackoverflow com questions 10306063 nested handlebarsjs each helpe
  • Ember:在 Mixin 中以编程方式设置 queryParams

    我正在尝试以编程方式在 Ember Mixin 中定义 queryParams mixin 有一个方法 当持有 mixin 的控制器初始化时会调用该方法 setupQueryParams params gt params forEach p
  • 按属性按优先级排序

    我有想要排序的项目 我的项目在模型上计算了属性 包括winning bidding closed and watching 这些属性中的每一个都是 true 或 false 我想对项目进行排序 以便所有获胜项目位于第一 然后是所有投标项目
  • 如何更改 Ember 中的查询参数?

    我正在编写一个动作处理程序route application actions changeFoo foo I want to change the fooId queryParam to foo get id 问题是我能找到的唯一记录的更改
  • 目标的事件委托

    在下面的代码中 我的click事件代表和所有三个 click 我的视图层次结构中的处理程序被解雇 不过我也想火 edit 在我的整个视图层次结构中 edit 只是我的元素的目标 child view Template
  • 使用 Ember.js 为每个模型添加额外的 url 参数

    我有两个模型 App Providers DS Model extend name DS attr string description DS attr string logo DS attr string products DS hasM
  • Ember:断言失败:EmberObject.create 不再支持定义计算属性

    我使用的是 Ember 2 16 版本 我们升级到了 3 8 版本升级后 我看到此错误 但无法弄清楚错误来自何处 在什么情况下我会收到此错误 我看到其中一篇帖子 Ember JS 中的动态计算属性已弃用 https stackoverflo
  • 观察嵌套对象的属性

    小提琴示例 http emberjs jsbin com aviyUnA 9 edit html js 输出 http emberjs jsbin com aviyUnA 9 edit html js output 这是我的模型 name
  • 恢复对 ember 数据模型的更改

    有没有办法轻松恢复对 Ember 数据模型的更改 我有一个绑定到编辑视图的模型 此视图使用户能够取消编辑 此时我想恢复对模型的更改 有没有一种简单的方法可以做到这一点 而无需克隆所有值 从 Ember Data 版本 2 开始 不再有交易
  • Ember:如何使用 i18n lib 翻译占位符?

    See http jsfiddle net cyclomarc 36VS3 1 http jsfiddle net cyclomarc 36VS3 1 我正在使用 Ember i18n lib 进行翻译 如何在 Ember TextFiel
  • 告诉 ember.js 对其模型的“id”使用不同的密钥

    我陷入了不应该回来的境地idAPI 端点中的字段 我需要告诉 ember 使用slug字段为 而不是id I tried DS RESTAdapter map App Post id key slug 虽然这对于App Post find
  • 计算属性应该在模型或控制器中声明吗?

    具有以下用户模型 Sks User DS Model extend firstName DS attr string lastName DS attr string fullName 计算属性应该在哪里声明 fullName Ember c
  • 如何清除ember js中的表单数据

    嗨 我对 ember js 很陌生 我写了一个新员工入职表格 并通过路线发送数据 数据保存成功 但问题是提交表单后我的表单数据没有清除 代码如下 app js App Router map function this resource sa
  • 在 #each 内渲染视图

    每当我尝试在 each 块内渲染视图时 我都会收到一条 PrecompilationError 消息 Compiler said Error each doesn t match view Example each posts view A
  • Ember Data 中出现“超出最大调用堆栈大小”错误的原因可能是什么?

    Ember 发布新版本 3 6 0 后 我开始在控制台中收到错误 rsvp js 24 未捕获 RangeError 超出最大调用堆栈大小 在 WeakMap get 在 getCacheFor metal js 25 在 Computed
  • 如何在 Ember 中捕获数组是否插入到车把中?

    我希望这不是重复的问题 但我无法找到解决方案 我有工作和用户 一个用户有很多工作 JP User DS Model extend firstName DS attr string lastName DS attr string email
  • 在哪里放置固定装置?

    我应该在使用 ember cli 生成的 Ember JS 应用程序中的哪里定义固定装置 我尝试过很多地方 例如app js并在一个名为 fixtures 的文件夹中 经过一番挖掘后我发现改变Ember MODEL FACTORY INJE

随机推荐