如何构造一个can.Map,其计算值与普通属性相似?

时间:2014-09-17 21:42:21

标签: canjs canjs-map

我们说我有一张地图:

map = new can.Map({foo: 'bar'})

我希望在另一个地图中绑定foo的值。我能做到:

otherMap = new can.Map({fizzle: map.compute('foo')})

但这并不像我期望的那样。

  1. 我希望otherMap.attr('fizzle')返回bar,而是返回一个函数。我必须致电otherMap.attr('fizzle')()
  2. 我希望能够通过调用otherMap.attr('fizzle', 'moo')来更改该值,但这并不会更改计算值。相反,如果我想更改基础值,我必须调用otherMap.attr('fizzle')('moo')
  3. 有没有办法创建一个具有与普通属性相似的计算值的地图?

    谢谢!

1 个答案:

答案 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中的演示。