2015-05-12 47 views
0

我有一個屬性mood它是一個組件的接口的一部分。幕後我有一個計算的屬性稱爲_moodEmber的易失性和模板

const { computed, typeOf } = Ember; 
_mood: computed('mood','A','B','C' function() { 
    let mood = this.get('mood'); 
    if (typeOf(mood) === 'function') { 
    mood = mood(this); 
    } 
    return !mood || mood === 'default' ? '' : `mood-${mood}`; 
}).volatile(), 

我在那裏與Ember的計算對象,它掛在volatile()解決所有非DOM的單元測試成功,但由於某種原因,它是不是一個情況觸發模板在任何情況下更新DOM。它至少應該更新被監視的任何屬性是否改變(在這種情況下爲['mood','A', 'B', 'C'])。由於它是易變的(即,不會緩存結果),如果模板知道重新渲染組件,但由於某種原因,它不會將新結果顯示在模板中。

如果我刪除volatile()標記,它對靜態/標量值工作正常,但是如果情緒是函數,那麼結果將被緩存,因此它只能工作一次(不是此問題的工作解決方案)。

我該如何得到兩全其美?

+0

在開始的時候不是說''('init')'是否意味着屬性只在初始化時被計算?您使用的CP的語法不同於我以前看到的,因此我可能會誤讀。 – pjmorse

+0

因爲我正在開發一個插件,所以我沒有使用函數原型;我還使用了'on'和'computed'的快捷方式,完全限定爲'Ember.on'和'Ember.computed'。這就是說...對你原來的陳述...... on('init','lead-in只是確保它在init事件上運行,但是'calculate(...)'部分確保它每次被檢查聲明的屬性已更新 – ken

+0

我將添加一些調整以使事情更清晰 – ken

回答

1

我還不確定爲什麼volatile()方法關閉對模板的更新。這可能是一個真正的錯誤,但在解決我的問題方面,重要的是要認識到的是,方法不是最好的方法。

相反,以確保最重要的事情是,當mood進來作爲功能該函數的依賴關係都包含在CP的依賴。所以,舉例來說,如果mood是通過了以下功能:

mood: function(context) { 
    return context.title === 'Monkeys' ? 'happy' : 'sad'; 
} 

對於此功能有效地評估 - 更重要的是在合適的時間,以觸發重新評估 - title屬性必須成爲其中的一部分計算的屬性。但願這是直線前進,以爲什麼但這裏是我怎麼想我可能會接納這樣的:

_moodDependencies: ['title','subHeading','style'], 
_mood: computed('mood','size','_moodDependencies', function() { 
    let mood = this.get('mood'); 
    console.log('mood is: %o', mood); 
    if (typeOf(mood) === 'function') { 
    run(()=> { 
     mood = mood(this); 
    }); 
    } 
    return !mood || mood === 'default' ? '' : `mood-${mood}`; 
}), 

這是更好的,因爲它允許在生成時的一組靜態屬性,以每個組件進行定義(在_mood CP對我來說是幾個組件使用的mixin的一部分)。不幸的是,這還沒有完全工作,因爲它顯然沒有解開/解構_moodDependencies

我會得到這個排序和更新這個,除非別人讓我跳到一拳。