阿刚

阿刚

开心做事,快乐做人!

  • 财富值

    115

  • 威望值

    0

  • 总积分

    225

个人信息

  • 回复了 的说说
    找女朋友,是个女的就行
    活的就行
  • 赞了说说
    祝新浪 20 周年生日快乐! 💝 🎁 🎂
  • 2018-10-16 已签到
    连续签到1天,获得了5个金钱
  • 2018-10-08 已签到
    连续签到1天,获得了5个金钱
  • 2018-09-26 已签到
    连续签到1天,获得了5个金钱
  • 2018-09-19 已签到
    连续签到1天,获得了5个金钱
  • 关注了
  • 2018-08-23 已签到
    连续签到1天,获得了5个金钱
  • 关注了
  • 回复了 的回复

    不是 bug. frontend 配置能不能覆盖 common 配置由 ArrayHelper::merge() 的实现方式决定,与 asset manager 无关。

    For integer-keyed elements, the elements from the latter array will be appended to the former array. You can use yii\helpers\UnsetArrayValue object to unset value from previous array or yii\helpers\ReplaceArrayValue to force replace former value instead of recursive merging.

    https://www.yiiframework.com/doc/guide/2.0/en/helper-array#merging-arrays

    对照上面的说明,不难理解为什么你的配置合并后并未去除 jQuery: 因为 common 和 frontend 中 js option 的值都是 integer-keyed elements (分别是 ['jquery.js'][]), 所以 Yii 将 [] 直接 append to ['jquery.js'], 最终的结果还是 ['jquery.js'], 即需要 jQuery.

    如果想要达到强制覆盖的效果,文档中讲得也很清楚:使用 yii\helpers\ReplaceArrayValue 即可,例如,你的 backend 配置数组可以这么写:

    'bundles' => [
        'yii\web\JqueryAsset' => [
            'js' => new \yii\helpers\ReplaceArrayValue([]),
        ],
    ],
    

    更省事的办法是像你说的解决方案那样,直接将后者的值显性赋值为 null, 原理就是让两个值得类型不同,类型一旦不同,后者自然就直接覆盖前者了。

    你的回答最专业!

见习主管 等级规则
225/500
资料完整度
60/100
用户活跃度
0/100

Ta的关注

12

Ta的粉丝

2

Ta的访客

40