Angular 2: Bootstrap 开关不改变变量的值
Angular 2: Bootstrap Switch not changing value of variable
我在 Angular 2 应用程序中为复选框使用引导开关。当您单击开关时,我希望 class 中的 LightNeeded
变量的值随之改变。我有以下代码:
HTML:
<input class="bootstrap-switch light-needed" name="LightNeeded" type="checkbox" [(ngModel)]="LightNeeded">
TypeScript 文件:
LightNeeded: boolean;
ngOnInit(): void {
// Invoke bootstrap switches
$('.bootstrap-switch').bootstrapSwitch({
onText: "Yes",
offText: "No"
});
this.changeBootstrapSwitchValues();
}
changeBootstrapSwitchValues() {
$('.light-needed').on('switchChange.bootstrapSwitch', function (event:any, state:any) {
if (state) {
console.log('true');
this.LightNeeded= true;
} else {
console.log('false');
this.LightNeeded= false;
};
});
}
当开关为真时,它成功地将真记录到控制台。当它为 false 时,它成功地将 false 记录到控制台。但是,它永远不会改变我的 LightNeeded
变量的值。
当我将鼠标悬停在 this.LightNeeded
的 this
上时,我收到以下警告:
suspicious 'this' usage: in current context 'this' refers to a local
function, not to a containing class.
如何让 this
以我想要的方式工作并更改我的 LightNeeded
变量的值?我愿意采取其他也有意义的方法。我尝试将 [attr.checked]="LightNeeded? true : null"
添加到我的输入中,但没有成功。
编辑:
添加 [(ngModel)]="LightNeeded"
的双向绑定在它是一个简单的复选框时有效,但由于某种原因 bootstrap 开关插件破坏了双向绑定。 JQuery Inputmask 和 JQuery UI Datepicker 等其他插件也会破坏双向绑定。
您的事件处理函数更改了 this
的上下文。相反,您应该使用箭头函数,它不会改变 context/binding。参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
示例:
$('.light-needed').on('switchChange.bootstrapSwitch', (event:any, state:any) => {
if (state) {
console.log('true');
this.LightNeeded= true;
} else {
console.log('false');
this.LightNeeded= false;
};
});
也许来晚了,但我为 angular2+ 制作了一个名为 jw-boostrap-switch-ng2 的组件,如果有人想查看的话。
是实现组件的更好解决方案,因为您不必担心 JQUERY。
这都是关于函数作用域的。 this
函数中的 changeBootstrapSwitchValues()
关键字指的是 JQuery 对象。您可以使用以下技术解决此问题;
changeBootstrapSwitchValues() {
let self = this;
$('.light-needed').on('switchChange.bootstrapSwitch', function (event:any, state:any) {
if (state) {
console.log('true');
//this.LightNeeded= true;
self.LightNeeded= true;
} else {
console.log('false');
//this.LightNeeded= false;
self.LightNeeded= false;
};
});
}
我在 Angular 2 应用程序中为复选框使用引导开关。当您单击开关时,我希望 class 中的 LightNeeded
变量的值随之改变。我有以下代码:
HTML:
<input class="bootstrap-switch light-needed" name="LightNeeded" type="checkbox" [(ngModel)]="LightNeeded">
TypeScript 文件:
LightNeeded: boolean;
ngOnInit(): void {
// Invoke bootstrap switches
$('.bootstrap-switch').bootstrapSwitch({
onText: "Yes",
offText: "No"
});
this.changeBootstrapSwitchValues();
}
changeBootstrapSwitchValues() {
$('.light-needed').on('switchChange.bootstrapSwitch', function (event:any, state:any) {
if (state) {
console.log('true');
this.LightNeeded= true;
} else {
console.log('false');
this.LightNeeded= false;
};
});
}
当开关为真时,它成功地将真记录到控制台。当它为 false 时,它成功地将 false 记录到控制台。但是,它永远不会改变我的 LightNeeded
变量的值。
当我将鼠标悬停在 this.LightNeeded
的 this
上时,我收到以下警告:
suspicious 'this' usage: in current context 'this' refers to a local function, not to a containing class.
如何让 this
以我想要的方式工作并更改我的 LightNeeded
变量的值?我愿意采取其他也有意义的方法。我尝试将 [attr.checked]="LightNeeded? true : null"
添加到我的输入中,但没有成功。
编辑:
添加 [(ngModel)]="LightNeeded"
的双向绑定在它是一个简单的复选框时有效,但由于某种原因 bootstrap 开关插件破坏了双向绑定。 JQuery Inputmask 和 JQuery UI Datepicker 等其他插件也会破坏双向绑定。
您的事件处理函数更改了 this
的上下文。相反,您应该使用箭头函数,它不会改变 context/binding。参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
示例:
$('.light-needed').on('switchChange.bootstrapSwitch', (event:any, state:any) => {
if (state) {
console.log('true');
this.LightNeeded= true;
} else {
console.log('false');
this.LightNeeded= false;
};
});
也许来晚了,但我为 angular2+ 制作了一个名为 jw-boostrap-switch-ng2 的组件,如果有人想查看的话。
是实现组件的更好解决方案,因为您不必担心 JQUERY。
这都是关于函数作用域的。 this
函数中的 changeBootstrapSwitchValues()
关键字指的是 JQuery 对象。您可以使用以下技术解决此问题;
changeBootstrapSwitchValues() {
let self = this;
$('.light-needed').on('switchChange.bootstrapSwitch', function (event:any, state:any) {
if (state) {
console.log('true');
//this.LightNeeded= true;
self.LightNeeded= true;
} else {
console.log('false');
//this.LightNeeded= false;
self.LightNeeded= false;
};
});
}