使用小部件时务必为每个组件定义一个自己的 id [ 技术分享 ]
使用小部件时务必为每个组件定义一个自己的id,不定义此id则会发生各种莫名其妙的错误:
NavBar::begin([
'id'=>'menu_top',//不定义此值,自动生成的id将是w0
'brandLabel' => Yii::$app->name,
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
echo Nav::widget([
'id'=>'menu_list',//不定义此值,自动生成的id将是w0(Yii2没有计数器,不会自动加1)
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => [
['label' => 'Home', 'url' => ['/site/index']],
echo GridView::widget([
'id'=>'article_list',//不定义此值,自动生成的id将是w0
'dataProvider' => $dataProvider,
$form = ActiveForm::begin([
'id'=>'article-form',//不定义此值,自动生成的id将是w0,表单验证时会出现各种错误,原因就是id与其他的冲突了,JS挂了。
'enableAjaxValidation' => false,
]);
(全文完)
共 1 条回复
-
yii\base\Widget 支持自动生成 id, 其静态属性 $counter 和 $autoIdPrefix 就是用来生成自动 id 的看这里。
要想让自动 id 起作用,关键是在 widget 初始化时,调用 $this->getId() 让计数器 $counter 自增,从而生成唯一的 id. 你列举的这几个 Yii 内置的 widgets 都是这么做的:
- Nav, NavBar: https://github.com/yiisoft/yii2-bootstrap/blob/master/src/BootstrapWidgetTrait.php#L61
- GridView: https://github.com/yiisoft/yii2/blob/master/framework/widgets/BaseListView.php#L124
BaseListView 是 GridView 的父类。 - ActiveForm: https://github.com/yiisoft/yii2/blob/master/framework/widgets/ActiveForm.php#L206
你的 widget id 不能自增的原因可能是你的 widget 的 init() 内没有显性执行
$options['id'] = $this->getId();
所致。共 1 条回复
阿江
注册时间:2015-10-18
最后登录:2024-03-03
在线时长:186小时21分
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276