我已经剪掉了设置初始数组的 init 函数。这是一个数组,索引为“A”、“B”、“C”等。每个都包含以该字母开头的站对象。
我有触发 setByInitial 的按钮,它们将相关的初始数组复制到内容中。
this.content.setObjects(this.initials[initial])
工作正常,我的视图更新,但是非常慢(150ms +)站对象非常大,其中有超过 3500 个......
this.set("content",Ember.copy(this.initials[initial],true))
是否更胖(大约 3 毫秒)更新了内容(从一些日志记录到控制台可以看出),但不会导致视图更新。
this.set("content",this.initials[initial])
甚至更快,但也不更新视图。
我试过使用 arrayContentDidChange() 等,但也无法让它工作。
如果我使用更快的方法,如何告知该 dfata 已更改的视图?还是有另一个 wau 可以做到这一点?
App.StationListController = Ember.ObjectController.extend({
content : [],
initials : [],
setByInitial : function(initial)
{
// this.content.setObjects(this.initials[initial])
this.set("content",Ember.copy(this.initials[initial],true))
}
});
<script type="text/x-handlebars" id="stationList">
<ul>
{{#each content}}
<li>{{#linkTo "station" u}}{{n}}{{/linkTo}}</li>
{{/each}}
</ul>
</script>
感谢@mike-grassotti 示例,我可以看到我正在做的事情应该有效,但它仍然没有!通常情况下,我在这里发布的是一种简化。我真正的应用程序并不是那么简单......
我的索引模板包含几个视图。每个视图都有自己的数据和控制器。因此,似乎是某种复杂性破坏了它。所以,我从迈克的例子开始,只添加了一点——为了朝着我真正想要的方向前进——并迅速打破了它!
我现在有:
变种应用
= Ember.Application.create({})
App.Router.map(function() {
this.resource('index', {path: '/'});
this.resource('station', {path: '/:code/:name'});
this.resource('toc', {path: '/toc/:code/:name'});
});
App.Station = Ember.Object.extend({});
App.IndexController = Ember.ObjectController.extend({
needs : ["StationList"],
listStationsByInitial: function(initial)
{
this.get("controllers.StationList").listByInitial(initial)
}
});
App.StationListView = Em.View.extend({
stationsBinding : 'App.StationListController',
init : function()
{
console.log("view created",this.stations)
}
});
App.StationListController = Ember.ArrayController.extend({
content : [],
initials : [[{u:1,n:'Abe'},{u:2,n:'Ace'}],[{u:3, n:'Barb'},{u:4,n:'Bob'}],[{u:5,n:'Card'},{u:6,n:'Crud'}]],
init : function()
{
this.set("content",this.initials[0])
},
listByInitial : function(initial)
{
this.set("content",this.initials[initial])
console.log('StationListController',this.content);
}
});
和
t type="text/x-handlebars" data-template-name="application">
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
<button {{action listStationsByInitial '0'}}>A</button>
<button {{action listStationsByInitial '1'}}>B</button>
{{#view App.StationListView controllerBinding="App.StationListController"}}
<ul>
{{#each stations}}
<li>{{#linkTo "station" u}}{{n}}{{/linkTo}}</li>
{{else}}
<li>No matching stations</li>
{{/each}}
</ul>
<button {{action listByInitial '2'}}>C</button>
{{/view}}}
</script>
首先,我不再看到渲染的电台列表。最初既不是,也不是单击按钮。
我希望 {{#with content}} 从 App.StationListController.content 中获取数据,但这不起作用。因此,我创建了 App.StationListView 并绑定了 stationBinding 到该控制器。还是不开心...
我在这里做错了什么?
其次,我的函数 listStationsByInitial 在我单击按钮 A 或 B 时被调用。所以我希望 listByInitial(在 StationListController 中)在我单击按钮 C 时被调用(因为它位于我说过要使用 StationListController 的视图内部)。但相反,我得到一个错误:
错误:断言失败:App.StationListController 上不存在操作“listByInitial”
为什么那行不通?
我在这里倍感沮丧,因为我已经使用 1.0.pre 版本构建了一个相当大且复杂的 Ember 应用程序( http://rail.dev.hazardousfrog.com/train-tickets ),现在我正试图提升我的知识 -最新版本,发现我学到的几乎所有东西都不再适用了!