4
我正在嘗試開發我的第一個mixin,但我無法很好地執行操作。動作在Ember Mixins中如何工作?
我希望我的控制器能夠切換editing
屬性並在模型保存或回退時將其設置爲false。所以我寫了一個mixin來增加這個功能。
在myapp/mixins/editable.js
:
import Ember from "ember";
export default Ember.Mixin.create({
editing: false,
actions: {
toggleEditing: function() {
this.toggleProperty('editing');
},
cancel: function() {
console.log("editable mixin: cancel");
this.set('editing', false);
return true;
},
save: function() {
console.log("editable mixin: save");
this.set('editing', false);
return true;
}
}
});
我認爲這將是偉大的,因爲我可以在我的模板像這樣一致的編輯按鈕。
在myapp/templates/sometemplate.hbs
:
{{#if editing}}
{{#if model.isDirty}}
<button class="action-icon" {{action "cancel"}}>{{fa-icon "times" title="discard changes"}}</button>
<button class="action-icon" {{action "save"}}>{{fa-icon "save" title="save changes"}}</button>
{{else}}
<button class="action-icon" {{action "toggleEditing"}}>{{fa-icon "times" title="cancel"}}</button>
{{/if}}
{{else}}
<button class="action-icon" {{action "toggleEditing"}}>{{fa-icon "pencil" title="edit"}}</button>
{{/if}}
...我可以控制節能和我的路線取消,像這樣:
在myapp/route/someroute.js
:
import Ember from "ember";
export default Ember.Route.extend({
model: function(params) {
return this.store.find('somemodel', params.model_id);
},
actions: {
save: function() {
console.log("route: save");
this.modelFor('somemodel').save();
},
cancel: function() {
console.log("route: cancel");
this.modelFor('somemodel').rollback();
},
}
});
不過,我現在困惑......如果保存失敗會發生什麼?我怎樣才能將它們放在一起,以便保存成功完成時editing
屬性設置爲false 只有?
有什麼方法可以從路線上的行動中獲得承諾嗎?我正在朝着正確的方向前進嗎?
關鍵似乎是在操作中調用this._super。如果我在中間控制器中實施保存操作,這是否適用?我不清楚它如何與「冒泡」行爲相互作用。我想我應該試着理解這個擴展與重新打開的東西。它看起來很古怪。 –
這些概念有點混亂,但有區別。冒泡動作是當一個動作從一個類到另一個類時。例如:組件 - >控制器 - >路由。但'_super'動作只會調用_same_類中已被覆蓋的動作。因此,在我的示例中,如果您從mixin操作返回「true」,它將調用路由中定義的超級方法,然後將操作冒泡到鏈中下一個最高路由。你很可能不想在這裏冒泡行動。 (我的建議:除非你絕對知道你需要,否則不要冒泡行動。) – GJK