首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有动态对象/属性的Angular 2- ngModel

具有动态对象/属性的Angular 2- ngModel
EN

Stack Overflow用户
提问于 2016-11-22 11:57:35
回答 4查看 7.1K关注 0票数 6

在我的TS文件中,我动态地创建了selectedValsObj对象的属性,如下所示:

代码语言:javascript
运行
复制
private selectValsObj: any = {};

setSelectedValsObj(sectionsArr) {
  sectionsArr.forEach(section => {
    section.questions.forEach(questionObj => {
      if (questionObj.type === 'drop-down') {
        this.selectValsObj[questionObj.questionId] = { selected: questionObj.answerDetails[0] };
      }
    })
  });
}

在我的超文本标记语言中,我希望将输入上的[ngModel]绑定到selectValsObj对象上的属性。我试过了,但没有成功:

代码语言:javascript
运行
复制
<div *ngFor="let question of section.questions">
    <div class="drop-down-question" *ngIf="question?.type === 'drop-down'">
        <select class="q-select"
                [(ngModel)]="selectValsObj[questionId].selected" // <== doesnt work either**
                // [(ngModel)]="selectValsObj[{{ questionId }}].selected" // <== doesnt work**
                name="answerForQuestion{{ question?.questionId }}">
            <option *ngFor="let answer of question?.answerDetails"
                [ngValue]="answer">
                    {{ answer?.value }}
            </option>
        </select>
    </div>
</div>

如何将超文本标记语言中的ngModel设置为TS文件中动态创建的属性?

EN

回答 4

Stack Overflow用户

发布于 2018-03-26 01:20:04

我试图复制这种情况,但在代码中,您发布的似乎存在多个问题。

  1. 属性selectValsObj被声明为private,但您试图在模板
  2. 中使用它在您试图迭代section.questions的模板中,但我没有看到它在其他地方定义,而是在setSelectedValsObj method forEach local scope
  3. 中,您可能因为缺少类型定义而错误地使用了数据

这是我所理解的代码,并添加了typedefs

代码语言:javascript
运行
复制
interface QuestionModel {
  type: string;
  questionId: string;
  answerDetails: string[];
}

const MOCK_DATA = [
  {
    questions: [{
      type: 'drop-down',
      questionId: '42',
      answerDetails: ['wololo'],
    }],
  },
];


@Component(...)
export class ProductsComponent {
  selectValsObj: { [key: string]: { selected: string } } = {};

  constructor() {
    this.setSelectedValsObj(MOCK_DATA);
  }

  setSelectedValsObj(sectionsArr: { questions: QuestionModel[] }[]) {
    sectionsArr.forEach(section => {
      section.questions.forEach(questionObj => {
        if (questionObj.type === 'drop-down') {
          this.selectValsObj[questionObj.questionId] = {selected: questionObj.answerDetails[0]};
        }
      });
    });
  }
}

在检查了类型定义是否如您最初预期的那样(并正确使用它)之后,您将避免许多bug。

此外,考虑使用更具声明性的方法,在方法中使用mapfilter而不是forEach

票数 5
EN

Stack Overflow用户

发布于 2018-03-30 22:51:17

对于您的HTML代码中的以下行:

代码语言:javascript
运行
复制
[(ngModel)]="selectValsObj[questionId].selected"

如果您没有将questionId定义为在ts文件中的任何位置都有值的变量,那么这可能就是问题所在。

如果您想要获取正在循环的section.questions列表中每个questionquestionId,可以尝试如下所示:

代码语言:javascript
运行
复制
[(ngModel)]="selectValsObj[question.questionId].selected"

我已经做了一个简单的例子,你可以在不同的工作情况下找到它(在src/app.ts中)。我希望它能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2018-09-24 13:41:08

代码语言:javascript
运行
复制
(click)="toggle(address.id)"
  *ngIf="action[address.id]"

在ts文件中:

代码语言:javascript
运行
复制
action: any = {};

在切换方法中,

代码语言:javascript
运行
复制
this.action[addressId] = !this.action[addressId];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40733528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档