Ember.js 嵌套视图中的Ember.alias
我试图创建一个可重用的生成元素,它可以对外部数据的变化做出反应。我在包含的视图中使用computed.alias执行此操作,但这可能是错误的方法,因为我似乎根本无法访问通用控制器对象 还有HTMLEmber.js 嵌套视图中的Ember.alias,ember.js,Ember.js,我试图创建一个可重用的生成元素,它可以对外部数据的变化做出反应。我在包含的视图中使用computed.alias执行此操作,但这可能是错误的方法,因为我似乎根本无法访问通用控制器对象 还有HTML <script type="text/x-handlebars"> <h2> Welcome to Ember.js</h2> {{outlet}} </script> <script type="text/x-h
<script type="text/x-handlebars">
<h2> Welcome to Ember.js</h2>
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
<h2>Awesome chart</h2>
{{view App.ChartView width=400 height=100}}
</script>
欢迎来到Ember.js
{{outlet}}
很棒的图表
{{view App.ChartView width=400 height=100}
值得一提的是,这个组件似乎也不起作用。ApplicationController是否是将在多个页面上使用的代码的唯一位置?“需求”似乎有效,但嵌套视图无法访问它。如果我制作了一个合适的Ember.Controller实例来装饰视图,这似乎也不起作用
非常感谢您的帮助
更新:
我无法编辑下面的评论,但我找到了一个很好的答案,即如何在一条路线中使用相关和不相关的模型
首先,您的控制器应该扩展
对象控制器
/阵列控制器
/控制器
App.AwesomeChartController = Ember.Controller.extend({...});
content: Ember.computed.alias('controller.data')
第二,除非明确定义,否则创建视图时,视图将采用父视图的控制器
{{view App.ChartView width=400 height=100 controller=controllers.awesomeChart}}
第三,您已经设置了需求(需要一个小的调整),但作为阅读本文的人的提醒,为了从控制器访问不同的控制器,您需要在该控制器的needs
属性中指定控制器名称
App.IndexController = Ember.Controller.extend({
needs: ['awesomeChart']
});
第四,从视图内部,您的计算别名更改为controller.data
。在视图中,它不再知道它是AwesomeChart
,就像controller
App.AwesomeChartController = Ember.Controller.extend({...});
content: Ember.computed.alias('controller.data')
第五,在('init')方法上的中,您需要在尝试显示内容之前实际获取('content')
<代码>内容
不在该方法的范围内
var content = this.get('content');
首先,
AwesomeChart
听起来像是一个可重用的独立组件。在这种情况下,您应该更好地使用Ember.Component
而不是Ember.View
(作为奖励,您会得到一个很好的助手:{{{awesome chart}}
)
其次,AwesomeChart
要真正可重用,它不应该关心获取数据或任何东西。相反,它应该假设它显式地获取数据
要做到这一点,您基本上需要从awesome图表组件中删除“content:”行,然后在模板中传递数据:
{{awesome-chart content=controllers.awesomeChart.data}}
现在,它比以前更加可重用
但为什么要到此为止?有一个单独的控制器来提取图表数据是很奇怪的。这属于以下型号:
App.ChartData = Ember.Object.extend();
App.ChartData.reopenClass({
fetch: function() {
return new Ember.RSVP.Promise(function(resolve) {
resolve([
{
id: 1,
complete: 50,
total: 100
},
{
id: 2,
complete: 70,
total: 200
}
]);
// or, in case of http request:
$.ajax({
url: 'someURL',
success: function(data) { resolve(data); }
});
});
}
});
将模型与控制器连接属于以下路径:
App.IndexController = Ember.ObjectController.extend();
App.IndexRoute = Ember.Route.extend({
model: function() {
return App.ChartData.fetch();
}
});
最后,以这种方式渲染:
{{awesome-chart content=model}}
太好了,谢谢。我是否也应该假设init方法需要这个?对于这是否是包含共享、状态感知元素的正确余烬惯用方法,您有什么看法?顺便说一句,needs['awesome_chart']似乎仍然有效(视图属性也相应地进行了调整),但这种命名约定很快就会被弃用吗?我被告知它是camelCase,所以我从未尝试过其他方法。如果有效,就没有损失
this.\u super()
仅当您覆盖了一个余烬方法时才需要调用,但您没有这样做,你只是有一个在init上触发的方法。我不确定我是否有足够的信息/用例来对这是否是最好的方法提出有效的意见。感谢你的回答和解决重用问题。但是,我想将这个特定的数据映射排除在路由模型之外,因为路由将拥有来自不同模型的自己的数据。毕竟,这个组件可以在应用程序中的任何地方使用,而不仅仅是在索引路由上。您是否了解如何正确处理这种情况,例如,仪表板中的每条路线都有多个模型?