与号中的相互依赖派生属性

Interdependent derived attributes in Ampersand?

本文关键字:依赖 派生 属性      更新时间:2023-09-26

我想创建一个向量的 Amp; 状态表示,该向量同时包含有关其极坐标和矩形表示的信息。

即我希望用户能够做到:

vector.angle = 90
vector.mag = 1
console.log vector.y #=> 1

-或-

vector.x = 0
vector.y = 1
console.log vector.angle #=> 90 

谁能想到用 & 符号做到这一点的方法?

这是一个老问题,但有人可能需要这个。我马上就能想到一种方法来做到这一点。您需要使所有变量独立,然后侦听更改以更新其他值。因此,您需要定义模型变量props anglemagxy,然后将视图initialize或其他地方的事件侦听器附加到每个变量。例如,对于angle,您将执行以下操作:

model.on('change:angle', function(model) {
    //first, calculate new x and y values. In your model you have a new angle value
    if (NEW_CALCULATED_X_VALUE != model.x || NEW_CALCULATED_Y_VALUE != model.y) {
        model.set({
            x: NEW_CALCULATED_X_VALUE
        }, {
            silent: true//I'm not triggering the 'change' event yet to avoid circular dependencies.
        }); 
        model.set({
            y: NEW_CALCULATED_Y_VALUE
        }, {
            silent: true
        });
        //now, once I've set all new values, I can trigger events.
        model.trigger('change:x', model); //this will trigger model.on('change:x'), but since based on this change angle and mag won't change, no circular dependency will appear.
        model.trigger('change:y', model);
    }
})

并对四个变量中的每一个重复此操作(有优化的空间,但你明白我的想法。为了避免与此示例的循环依赖关系,您需要确保一旦使用任何 x 重新计算角度,您将获得相同的角度。