我们说我有一张地图:
map = new can.Map({foo: 'bar'})
我希望在另一个地图中绑定foo
的值。我能做到:
otherMap = new can.Map({fizzle: map.compute('foo')})
但这并不像我期望的那样。
otherMap.attr('fizzle')
返回bar
,而是返回一个函数。我必须致电otherMap.attr('fizzle')()
。otherMap.attr('fizzle', 'moo')
来更改该值,但这并不会更改计算值。相反,如果我想更改基础值,我必须调用otherMap.attr('fizzle')('moo')
。有没有办法创建一个具有与普通属性相似的计算值的地图?
谢谢!
答案 0 :(得分:1)
我建议使用define plugin,这样可以轻松创建计算的getter和setter,而无需显式创建计算。在你的例子中这样:
var map = new can.Map({
foo: 'bar',
baz: 'bla'
});
var OtherMap = can.Map.extend({
define: {
fizzle: {
get: function() {
return map.attr('foo') + '/' + map.attr('baz');
},
set: function(value) {
map.attr('foo', value);
}
}
} });
var other = new OtherMap();
console.log(other.attr('fizzle'));
other.attr('fizzle', 'something');
console.log(map.attr('foo'));
this Fiddle中的演示。