2016-03-18 205 views
0

我嘗試覆蓋灰燼數據模型的保存功能:覆蓋模型保存

型號/ client.js

export default DS.Model.extend({ 
    billingAddress: DS.belongsTo('address'), 
    //... 
    save: function(...arg){ 
    var _this = this; 
    this.get('billingAddress').then(billingAddress=>{ 
     return billingAddress.save().then(function(){ 
     return _this._super(arg); 
     }); 
    }) 

    } 
}); 

別的地方我做

record.save().then(function(){ 
    // show a message 
}); 

我得到出現以下錯誤:

Uncaught TypeError: Cannot read property 'then' of undefined

SOLUTION

主要的問題是,從一個承諾調用super是不是直線前進,但可能

save: function(...arg){ 
    let _super = this._super; 
    return somePromise.then(() => _super.call(this)); 
    } 

回答

0

您保存執行不返回任何東西。 我認爲你必須返回從「_this._super(arg);」返回的承諾

export default DS.Model.extend({ 
    billingAddress: DS.belongsTo('address'), 
    //... 
    save: function(...arg){ 
    var _this = this; 
    return this.get('billingAddress').then(billingAddress=>{ 
     return billingAddress.save().then(function(){ 
     return _this._super(arg); 
     }); 
    }) 

    } 
}); 
+0

謝謝,但網絡流量只顯示一個POST(到地址端點),看起來客戶端保存從未觸發。 – user3568719

+0

你不能從承諾內退回超級 –

+0

@Kitler嗯。有沒有解決方案/解決方法?我認爲這是一個有效的用例:在保存主模型之前保存一些關係。 – user3568719

1

這的確是一個常見的模式,但我不會覆蓋模型的保存方法,而我會處理這件事上的路由/控制器的水平。

import Ember from 'ember'; 

const { Mixin, RSVP: { resolve } } = Ember; 

Ember.Mixin.create({ 
    beforeSave() { 
    return resolve(); 
    }, 
    save() { 
    this.beforeSave().then(() => this.get('currentModel').save()); 
    }, 
    { 
    actions: { 
     save() { 
     this.save(); 
     } 
    } 
    } 
}); 

你會說的mixin添加到您的路線,如果你把它添加到控制器currentModel變得model,並覆蓋beforeSave對付你們的關係,請務必從beforeSave回報的承諾。

+0

謝謝!我使用route-action進行「保存」的問題。這意味着模板按鈕的所有「保存」操作都會集中到一箇中心位置(應用程序路徑)。它檢查記錄是否是新的?如果是,則克隆它(清除表單),並向用戶顯示一條消息。如果沒有,那麼只需簡單地保存它並顯示更新消息。我真的不想在控制器中一遍又一遍地做這些事情。 – user3568719