【发布时间】:2013-09-01 15:17:45
【问题描述】:
有 2 个基于相同依赖项的计算属性仅运行一个计算属性。文档说它被缓存了当我想要以下情况时怎么办:
foo: (->
console.log 'foo'
).property('dependency')
bar: (->
console.log 'bar'
).property('dependency')
现在bar 没有被调用,我不得不求助于观察者。我可以让它工作吗?
编辑
问题是关于计算属性的,但它没有反映在示例代码中 - 而不是property,我使用了observes。现在已更改。很抱歉造成混乱。
编辑#2
我修改了@MilkyWayJoe 的出色示例,使其现在看起来像我的解决方案。不幸的是(或幸运的是)它有效,但我的解决方案没有。这是我所追求的要点:
在滑块的帮助下,我可以设置要转移到另一个信用卡提供商的余额值。假设值为transferValue。每当它发生变化时,我都必须计算加上转会费的年利息。
例如,假设我目前的信用卡中有 1000 美元,年利率为 19%。这太多了,所以我寻找另一种更便宜的解决方案。原来X银行提供Balance Transfer Credit Card Y,利率为10%+3.5%的转账手续费。
好的。所以我在滑块上设置了 1000 美元,这就是魔法。我想在价值发生变化时计算利率和转账费用。
在修改后的示例中它可以工作:http://jsfiddle.net/gqSMU/2/ 但在我的第一个解决方案中没有这样做。有点像这样:
cardInterest: (->
apr = @get 'purchaseRate'
amount = @get 'transferValue'
@get('calculatedTransferFee') + @calculateInterest apr, amount
).property('transferValue', 'calculatedTransferFee')
如您所见,它访问calculatedTransferFee。问题是没有重新计算该值。我不确定是否值得一提,但在第一个解决方案中,Handlebars 模板只请求了cardInterest。
这是我目前对观察者的解决方案:
calculatedTransferFee: 0
transferValueDidChange: (->
if @get('isCurrentCardChosen')
transferFee = parseFloat @get('balanceTransferRate') / 100
transferValue = @get 'transferValue'
calculatedTransferFee = if isNaN(transferFee) then 0 else transferFee * transferValue
@set 'calculatedTransferFee', calculatedTransferFee
).observes('transferValue')
这不是一个好的解决方案,是吗?这就是为什么我认为这可能是比求助于观察者更好的解决方案。
我希望现在它更清楚了。如有任何进一步的反馈,我将不胜感激!
【问题讨论】:
-
你能提供一个(不)工作的例子吗?并且您确定正在请求您的两个计算属性(使用 js 或模板获取)?如果它不被调用,它将永远不会被计算。
-
@RenanTomalFernandes 这很有趣。只有第一个
foo在模板中被请求 - 另一个bar不是,但我在foo中需要它 - 它是通过 @get 'foo' 请求的。但正如我所说,由于缓存了dependency,它没有被解雇。
标签: ember.js