价值不会在Angular中以收音机按钮绑定到评级组件

发布于 2025-01-29 21:12:14 字数 9801 浏览 1 评论 0原文

我有一个项目,我想拥有可以在其他组件上使用的评分组件(可重复使用),因为我还编写了一些CSS PSUDO选择器,这些选择器也没有应用于页面加载。我已经在这个论坛上尝试了所有答案,但是

对于Eg 将[(ngmodel)]添加到无线电按钮组后,默认[已检查]不再工作 还有更多。

捻: 然后,为了识别(经过大量的尝试和阅读答案)并尝试,我在我的其他一些项目中添加了该组件,并且在那里正常工作。在页面加载,如果ts文件具有标记= 3,则在页面加载中选择了3个星星。

之后,仅在此论坛上分享我创建了这个 stackblitz ,但这也是工作。 现在,我还将共享糟糕的项目和好项目的代码,不确定问题是什么

糟糕的项目

HTML

<!-- star rating -->
<div class="rating-wrapper">

  <!-- star 5 -->
  <input type="radio" id="5-star-rating" name="star-rating" value="5" [checked]="starrating === '5'" [(ngModel)]="starrating">
  <label for="5-star-rating" class="star-rating">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 4 -->
  <input type="radio" id="4-star-rating" name="star-rating" value="4" [checked]="starrating === '4'" [(ngModel)]="starrating">
  <label for="4-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 3 -->
  <input type="radio" id="3-star-rating" name="star-rating" value="3" [checked]="starrating === '3'" [(ngModel)]="starrating">
  <label for="3-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 2 -->
  <input type="radio" id="2-star-rating" name="star-rating" value="2" [checked]="starrating === '2'" [(ngModel)]="starrating">
  <label for="2-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 1 -->
  <input type="radio" id="1-star-rating" name="star-rating" value="1" [checked]="starrating === '1'" [(ngModel)]="starrating">
  <label for="1-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>
 
</div>

组件TS文件 TS文件

import { Component,  OnInit  } from '@angular/core';

@Component({
  selector: 'FH-rating',
  templateUrl: './rating.component.html',
  styleUrls: ['./rating.component.css']
})
export class RatingComponent implements OnInit {

  starrating="3";   /// <==== THESE ARE THE STARS THAT I WANT TO HAVE SELECTED BY DEFAULT ON PAGE LOAD
//coachrating:string='5';
  constructor() { }


  ngOnInit(): void {

  }}

CSS文件 CSS文件

.container-wrapper {
  background-color: #EDF0F9;
}

.container {
  height: 100vh;
}

.rating-wrapper {
  align-self: center;
  box-shadow: 7px 7px 25px rgba(198, 206, 237, 0.7), -7px -7px 35px rgba(255, 255, 255, 0.7), inset 0px 0px 4px rgba(255, 255, 255, 0.9), inset 7px 7px 15px rgba(198, 206, 237, 0.8);
  border-radius: 4rem;
  display: inline-flex;
  direction: rtl !important;
  padding: 1.5rem 2.5rem;
  margin-left: auto;
}
.rating-wrapper label {
  color: #E1E6F6;
  cursor: pointer;
  display: inline-flex;
  font-size: 2.1rem;
  padding: 1rem 0.6rem;
  transition: color 0.5s;
}
.rating-wrapper svg {
  -webkit-text-fill-color: transparent;
  -webkit-filter: drop-shadow 4px 1px 6px #c6ceed;
  filter: drop-shadow(5px 1px 3px #c6ceed);
}
.rating-wrapper input {
  height: 100%;
  width: 100%;
}
.rating-wrapper input {
  display: none;
}
.rating-wrapper label:hover,
.rating-wrapper label:hover ~ label,
.rating-wrapper input:checked ~ label {
  color: #34AC9E;
}
.rating-wrapper label:hover,
.rating-wrapper label:hover ~ label,
.rating-wrapper input:checked ~ label {
  color: #34AC9E;
}

包。json文件

{
  "name": "fit-hub",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~10.0.5",
    "@angular/common": "~10.0.5",
    "@angular/compiler": "~10.0.5",
    "@angular/core": "~10.0.5",
    "@angular/forms": "~10.0.5",
    "@angular/platform-browser": "~10.0.5",
    "@angular/platform-browser-dynamic": "~10.0.5",
    "@angular/router": "~10.0.5",
    "@auth0/angular-jwt": "^5.0.2",
    "angularx-social-login": "^3.5.7",
    "bootstrap": "^4.5.3",
    "font-awesome": "^4.7.0",
    "jquery": "^3.5.1",
    "popper.js": "^1.16.1",
    "rxjs": "~6.5.5",
    "tslib": "^2.0.0",
    "zone.js": "~0.10.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1000.4",
    "@angular/cli": "~10.0.4",
    "@angular/compiler-cli": "~10.0.5",
    "@types/node": "^12.11.1",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^6.0.0",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~5.0.0",
    "karma": "~5.0.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~3.3.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "protractor": "~7.0.0",
    "ts-node": "~8.3.0",
    "tslint": "~6.1.0",
    "typescript": "~3.9.5"
  }
}

现在好项目。 ts,css 文件的精确副本时,请相信我,所以我将只放置

当我说html ,

{
  "name": "event-hub",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~10.0.5",
    "@angular/common": "~10.0.5",
    "@angular/compiler": "~10.0.5",
    "@angular/core": "~10.0.5",
    "@angular/forms": "~10.0.5",
    "@angular/platform-browser": "~10.0.5",
    "@angular/platform-browser-dynamic": "~10.0.5",
    "@angular/router": "~10.0.5",
    "angularx-social-login": "^4.1.0",
    "bootstrap": "^4.5.0",
    "font-awesome": "^4.7.0",
    "jquery": "^3.5.1",
    "rxjs": "~6.5.5",
    "toastr": "^2.1.4",
    "tslib": "^2.0.0",
    "zone.js": "~0.10.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1000.4",
    "@angular/cli": "~10.0.4",
    "@angular/compiler-cli": "~10.0.5",
    "@types/node": "^12.11.1",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^6.0.0",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~5.0.0",
    "karma": "~5.0.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~3.3.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "protractor": "~7.0.0",
    "ts-node": "~8.3.0",
    "tslint": "~6.1.0",
    "typescript": "~3.9.5"
  }
}

package.json 检查我的边缘的收音机按钮,我看到好项目的代码生成了以下

&lt; input _ngcontent-bqk-c61 =“” type =“无线电” ID =“ 1-Star评分”名称=”星级评级“ value =” 1“ ng-reflect-name =”恒星评级“ ng-reflect-value =” 1“ ng-reflect-model =“ 3” class =“ ng-untunted ng-ing ng-pristine ng-valid “&gt;

但是当我看到我的坏项目elemet时,我会看到下面的

&lt; input _ngcontent-yor-c47 =“” type =“无线电” id =“ id =” 1-Star评级“名称=”星级评级“ value =” 1“ ng-reflect-name =” star-rating“ ng-reflect-value =“ 1”&gt;

请观察ng-refleflect-model Angular添加了,我缺少什么?需要急需帮助

编辑1

也为好项目制作代码,它可能会有所帮助,

html

<!-- star rating -->
<div class="rating-wrapper">

  <!-- star 5 -->
  <input type="radio" id="5-star-rating" name="star-rating" value="5" [checked]="starrating === '5'" [(ngModel)]="starrating">
  <label for="5-star-rating" class="star-rating">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 4 -->
  <input type="radio" id="4-star-rating" name="star-rating" value="4" [checked]="starrating === '4'" [(ngModel)]="starrating">
  <label for="4-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 3 -->
  <input type="radio" id="3-star-rating" name="star-rating" value="3" [checked]="starrating === '3'" [(ngModel)]="starrating">
  <label for="3-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 2 -->
  <input type="radio" id="2-star-rating" name="star-rating"  value="2" [checked]="starrating === '2'" [(ngModel)]="starrating">
  <label for="2-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 1 -->
  <input type="radio" id="1-star-rating" name="star-rating"  value="1" [checked]="starrating === '1'" [(ngModel)]="starrating">
  <label for="1-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>
</div>

ts file

import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';

@Component({
  selector: 'app-star',
  templateUrl: './star.component.html',
  styleUrls: ['./star.component.css']
})
export class StarComponent implements OnChanges {

  // @Input() rating: number;
  // starWidth: number;
  // @Output() notifyRatingChange: EventEmitter<string> = new EventEmitter<string>();
   starrating="4";
//coachrating:string='5';
  constructor() { }

  ngOnChanges(): void {
    //this.starWidth = this.rating * 75 / 5;
  }

  onClick(): void {
   // this.notifyRatingChange.emit("clicked!");
    //console.log(`${this.rating} was clicked`);
  }

}

i have a project where I want to have the rating component (reusable) which i can use on other component, for that i have written some CSS psudo selectors as well which are not getting applied on page load. i have tried allmost all the answers on this forum but nothing is working

for e.g. After adding [(ngModel)] to a radio button group, the default [checked] no longer works
and many more.

Twist:
Then just to identify(after lot of tries and reading answers) and try out, i added that component in some other project of mine and it is working perfectly there. on page load if the ts file has starrating=3 then 3 stars are getting selected on page load.

after that just to share on this forum i created this stackblitz but that is also working.
now i will share code for BAD project and GOOD project as well, not sure what is the issue

BAD PROJECT

HTML

<!-- star rating -->
<div class="rating-wrapper">

  <!-- star 5 -->
  <input type="radio" id="5-star-rating" name="star-rating" value="5" [checked]="starrating === '5'" [(ngModel)]="starrating">
  <label for="5-star-rating" class="star-rating">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 4 -->
  <input type="radio" id="4-star-rating" name="star-rating" value="4" [checked]="starrating === '4'" [(ngModel)]="starrating">
  <label for="4-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 3 -->
  <input type="radio" id="3-star-rating" name="star-rating" value="3" [checked]="starrating === '3'" [(ngModel)]="starrating">
  <label for="3-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 2 -->
  <input type="radio" id="2-star-rating" name="star-rating" value="2" [checked]="starrating === '2'" [(ngModel)]="starrating">
  <label for="2-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 1 -->
  <input type="radio" id="1-star-rating" name="star-rating" value="1" [checked]="starrating === '1'" [(ngModel)]="starrating">
  <label for="1-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>
 
</div>

components TS file
ts file

import { Component,  OnInit  } from '@angular/core';

@Component({
  selector: 'FH-rating',
  templateUrl: './rating.component.html',
  styleUrls: ['./rating.component.css']
})
export class RatingComponent implements OnInit {

  starrating="3";   /// <==== THESE ARE THE STARS THAT I WANT TO HAVE SELECTED BY DEFAULT ON PAGE LOAD
//coachrating:string='5';
  constructor() { }


  ngOnInit(): void {

  }}

CSS file
CSS file

.container-wrapper {
  background-color: #EDF0F9;
}

.container {
  height: 100vh;
}

.rating-wrapper {
  align-self: center;
  box-shadow: 7px 7px 25px rgba(198, 206, 237, 0.7), -7px -7px 35px rgba(255, 255, 255, 0.7), inset 0px 0px 4px rgba(255, 255, 255, 0.9), inset 7px 7px 15px rgba(198, 206, 237, 0.8);
  border-radius: 4rem;
  display: inline-flex;
  direction: rtl !important;
  padding: 1.5rem 2.5rem;
  margin-left: auto;
}
.rating-wrapper label {
  color: #E1E6F6;
  cursor: pointer;
  display: inline-flex;
  font-size: 2.1rem;
  padding: 1rem 0.6rem;
  transition: color 0.5s;
}
.rating-wrapper svg {
  -webkit-text-fill-color: transparent;
  -webkit-filter: drop-shadow 4px 1px 6px #c6ceed;
  filter: drop-shadow(5px 1px 3px #c6ceed);
}
.rating-wrapper input {
  height: 100%;
  width: 100%;
}
.rating-wrapper input {
  display: none;
}
.rating-wrapper label:hover,
.rating-wrapper label:hover ~ label,
.rating-wrapper input:checked ~ label {
  color: #34AC9E;
}
.rating-wrapper label:hover,
.rating-wrapper label:hover ~ label,
.rating-wrapper input:checked ~ label {
  color: #34AC9E;
}

package.json file

{
  "name": "fit-hub",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~10.0.5",
    "@angular/common": "~10.0.5",
    "@angular/compiler": "~10.0.5",
    "@angular/core": "~10.0.5",
    "@angular/forms": "~10.0.5",
    "@angular/platform-browser": "~10.0.5",
    "@angular/platform-browser-dynamic": "~10.0.5",
    "@angular/router": "~10.0.5",
    "@auth0/angular-jwt": "^5.0.2",
    "angularx-social-login": "^3.5.7",
    "bootstrap": "^4.5.3",
    "font-awesome": "^4.7.0",
    "jquery": "^3.5.1",
    "popper.js": "^1.16.1",
    "rxjs": "~6.5.5",
    "tslib": "^2.0.0",
    "zone.js": "~0.10.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1000.4",
    "@angular/cli": "~10.0.4",
    "@angular/compiler-cli": "~10.0.5",
    "@types/node": "^12.11.1",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^6.0.0",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~5.0.0",
    "karma": "~5.0.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~3.3.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "protractor": "~7.0.0",
    "ts-node": "~8.3.0",
    "tslint": "~6.1.0",
    "typescript": "~3.9.5"
  }
}

now the good project. Trust me when i say the html,ts,css file exact copy of them, so i will put just package.json here for GOOD project

GOOD PROJECT

package.json

{
  "name": "event-hub",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~10.0.5",
    "@angular/common": "~10.0.5",
    "@angular/compiler": "~10.0.5",
    "@angular/core": "~10.0.5",
    "@angular/forms": "~10.0.5",
    "@angular/platform-browser": "~10.0.5",
    "@angular/platform-browser-dynamic": "~10.0.5",
    "@angular/router": "~10.0.5",
    "angularx-social-login": "^4.1.0",
    "bootstrap": "^4.5.0",
    "font-awesome": "^4.7.0",
    "jquery": "^3.5.1",
    "rxjs": "~6.5.5",
    "toastr": "^2.1.4",
    "tslib": "^2.0.0",
    "zone.js": "~0.10.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1000.4",
    "@angular/cli": "~10.0.4",
    "@angular/compiler-cli": "~10.0.5",
    "@types/node": "^12.11.1",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^6.0.0",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~5.0.0",
    "karma": "~5.0.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~3.3.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "protractor": "~7.0.0",
    "ts-node": "~8.3.0",
    "tslint": "~6.1.0",
    "typescript": "~3.9.5"
  }
}

When I inspect my radio button in my edge i see that the GOOD project has code generated something like below

<input _ngcontent-bqk-c61="" type="radio" id="1-star-rating" name="star-rating" value="1" ng-reflect-name="star-rating" ng-reflect-value="1" ng-reflect-model="3" class="ng-untouched ng-pristine ng-valid">

but when i see my BAD project elemet i see like below

<input _ngcontent-yor-c47="" type="radio" id="1-star-rating" name="star-rating" value="1" ng-reflect-name="star-rating" ng-reflect-value="1">

please observe the ng-reflect-model has been added by angular, what is that I am missing? need help badly

EDIT 1

putting code for GOOD project as well, it might help,

html

<!-- star rating -->
<div class="rating-wrapper">

  <!-- star 5 -->
  <input type="radio" id="5-star-rating" name="star-rating" value="5" [checked]="starrating === '5'" [(ngModel)]="starrating">
  <label for="5-star-rating" class="star-rating">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 4 -->
  <input type="radio" id="4-star-rating" name="star-rating" value="4" [checked]="starrating === '4'" [(ngModel)]="starrating">
  <label for="4-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 3 -->
  <input type="radio" id="3-star-rating" name="star-rating" value="3" [checked]="starrating === '3'" [(ngModel)]="starrating">
  <label for="3-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 2 -->
  <input type="radio" id="2-star-rating" name="star-rating"  value="2" [checked]="starrating === '2'" [(ngModel)]="starrating">
  <label for="2-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>

  <!-- star 1 -->
  <input type="radio" id="1-star-rating" name="star-rating"  value="1" [checked]="starrating === '1'" [(ngModel)]="starrating">
  <label for="1-star-rating" class="star-rating star">
    <i class="fa fa-star d-inline-block"></i>
  </label>
</div>

ts file

import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';

@Component({
  selector: 'app-star',
  templateUrl: './star.component.html',
  styleUrls: ['./star.component.css']
})
export class StarComponent implements OnChanges {

  // @Input() rating: number;
  // starWidth: number;
  // @Output() notifyRatingChange: EventEmitter<string> = new EventEmitter<string>();
   starrating="4";
//coachrating:string='5';
  constructor() { }

  ngOnChanges(): void {
    //this.starWidth = this.rating * 75 / 5;
  }

  onClick(): void {
   // this.notifyRatingChange.emit("clicked!");
    //console.log(`${this.rating} was clicked`);
  }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文