我有以下代码正在使用“类设置器代理”。在我的示例中,我正在跟踪特定变量以更新其他一些变量。我的安装员正在将所有更改的日志写入控制台。但是,如果我尝试从设置器本身修改变量,则修改变量gas,但不调用Proxy。是否设计避免循环?还是我错过了什么?
$categories = CarCarProperty::where('car_id',$arac->id)->pluck('car_property_category_id')->toArray();
$properties = CarCarProperty::where('car_id',$arac->id)->wherein('car_property_category_id',$categories )->pluck('car_property_id')->toArray();
$propertylist= [];
$data= [];
$data['category'] = [];
$data['property'] = [];
foreach($categories as $category ){
$findcategory= CarPropertyCategory::where('id',$category)->first();
$data['category'] = $findcategory->title;
foreach($properties as $property){
$findproperty = CarProperty::where('id',$property)->first();
if($category->id == $findproperty->category->id){
$property= $findproperty ->title;
$data['properties'] = $property;
}
}
$propertylist[] = $data;
}
$propertylist= collect($propertylist)->groupBy('category');
答案 0 :(得分:1)
问题是您的陷阱仅运行obj[prop] = value
,该陷阱在目标obj
而非代理上设置了属性。相反,您应该使用Reflect.set
method,它为set陷阱提供默认实现,并需要一个可选的receiver
参数。此接收者是设置者将要评估的对象,您应该传递receiver
argument of the set
trap(它将引用您为newHero
分配的resistance
代理)。
class DarthVader {
set resistance(val) {
this._resistance= val
this.darkSide = false
}
get resistance() { return this._R2D2 }
}
let newHero = new Proxy(new DarthVader, {
set(target, prop, value, receiver) {
console.log(`Setting ${prop} to ${value}`)
return Reflect.set(target, prop, value, receiver)
// ^^^^^^^^^^^
// obj[prop] = value
}
});
newHero.resistance = 11
console.log(newHero.darkSide)
答案 1 :(得分:-1)
obj
中的set
指的是this
时return new Proxy(this
的含义,并且该对象不是是代理,但是darthVader
实例本身-由darthVader
构造函数创建的实例。因此,当您将属性分配给obj
时,会将属性直接放在darthVader
实例上,而不是放在代理实例(即newHero
)上。因此,代理方法不会被调用。
如果您想递归调用代理,可以在从构造函数返回它之前定义它(例如,作为变量名proxy
),然后在{{1 }}方法,但是在当前逻辑下,这会导致堆栈溢出,因为您将不断调用代理的setter:
proxy