我有某種「短劃線視圖」,其中顯示了一部分項目。 該項目可能會「切換」(通過某些導航)以顯示在主插座中。到目前爲止,我沒有使用Ember的路由器/狀態管理器,但是我手動序列化/反序列化了URL,並使用window.history啓用了後退/前進和「按URL恢復」功能。 例如Ember路由器動態路由
#/dash/foo,bar
#/dash/foo,bar,ted
應分別顯示foo,bar和ted元素。這些項目可能會在後臺加載。因此,如果您通過書籤/直接編輯網址來恢復應用程序狀態,那麼實際上可能會在一段時間後纔會到達。
我嘗試使用Ember.Router這個東西,但我只是不明白它的工作...
我通過這個偉大的指導http://emberjs.com/guides/router_primer/讀取。 但是描述的場景總是這樣:你有一個集合視圖和一個單獨的項目視圖。但是這並不適用於我的應用程序。
在這種情況下,我有3個項目,我想選擇其中的一些顯示在插座,通過切換它們。 (通常這可以是選擇,取消選擇,切換或按表達式搜索)。選中的短劃線狀態應該被序列化爲URL,並且可以通過書籤或直接對URL進行修改。
繃實現這樣的:
<a {{action toggle name href=true}}>{{name}}</a>
這是數據獲取和選擇邏輯如何,現在(它不工作雖然)
App.dash = Ember.Object.create({
FIXTURE: [App.Item.create({
name: 'foo',
detail: 'Some very interesting foo'
}),App.Item.create({
name: 'bar',
detail: 'Bar is the root of all stuff'
}),App.Item.create({
name: 'ted',
detail: 'Ted is not my name'
})],
store: Ember.A(),
selected: Ember.A(),
_items: Ember.A(),
watchItems: function() {
var items = this._items;
var store = this.store;
items.clear();
this.get('selected').forEach(function (name) {
var item = store.findProperty('name', name);
items.pushObject(item);
});
}.observes('selected', 'store'),
toggle: function (name) {
var selected = this.get('selected');
var index = selected.indexOf(name);
if (index !== -1) {
selected.removeAt(index);
} else {
selected.push(name);
}
this.set('selected', selected);
},
fetch: function() {
var FIXTURE = this.FIXTURE;
var store = this.store;
if (store.length == 0) {
Ember.run.later(function() {
FIXTURE.forEach(function (item) {
store.pushObject(item);
});
}, 2000);
}
},
items: function (selected) {
var items = this._items;
items.clear();
if (Ember.isArray(selected)) {
this.set('selected', selected);
} else {
this.set('selected', []);
}
this.fetch();
return items;
}
});
這是路由器:
App.Router = Ember.Router.extend({
root: Ember.Route.extend({
index: Ember.Route.extend({
route: '/',
redirectsTo: 'dash'
}),
dash: Ember.Route.extend({
route: '/dash/:selected',
connectOutlets: function (router, context) {
var selected = context && context.selected;
var dashItems = App.dash.items(selected);
router.get('applicationController').connectOutlet('dash', dashItems);
},
deserialize: function (router, params) {
if (params.selected !== 'undefined') {
return params.selected;
}
},
serialize: function (router, context) {
var selected = App.dash.get('selected');
var hash = {
selected: selected
};
return hash;
},
toggle: function (router, event) {
event.preventDefault();
event.stopPropagation();
var name = event.context;
App.dash.toggle(name);
var selected = App.dash.get('selected');
router.transitionTo('dash', {
selected: selected
});
},
eventTransitions: {
toggle: 'dash'
}
})
})
});
這是完整的小提琴http://jsfiddle.net/NWfbj/1
任何幫助非常感謝!
在'items' fonction,你叫' items.clear()',然後返回項目。這是你真正想要的嗎? –
是的,這是預期的。項目功能應該清除當前選擇/所有顯示的項目。 this._items將填充在watchItems觀察者(異步)中。我試圖接近路由器入門http://emberjs.com/guides/router_primer/ App.Shoe.find方法。 – lipp