You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ng-model向数组插入数据时的字段清空问题解决

解决ng-repeat添加选项后输入框内容丢失的问题

这个问题我太熟悉了——本质是原始类型值绑定的局限性导致的!你现在把选项存在字符串数组里,而字符串是原始值,ng-model绑定到option时,其实绑定的是这个字符串的副本,当你push新元素触发数组重渲染后,原来的绑定关联就断了,自然输入的内容就没了。

直接用ng-model更新questionDetail.options数组的核心思路是:把数组元素从原始字符串改成引用类型的对象,这样ng-model绑定的是对象的属性,重渲染时引用不变,数据就能保留,还能直接更新原数组。

具体修改步骤:

1. 调整HTML模板(直接绑定对象属性)

把原来绑定字符串的逻辑改成绑定对象的text属性,去掉多余的ng-change和newlyAddedOptions相关代码:

<tr ng-repeat="option in eventCtrl.questionDetail.options track by $index">
    <th scope="row">Option {{$index + 1}}</th>
    <td>
        <!-- 绑定对象的text属性,直接修改原数组元素 -->
        <input type="text" ng-model="option.text" style="width:100%;">
    </td>
    <td>
        <button type="button" ng-confirm-click="Are you sure to delete?" confirmed-click="eventCtrl.removeOption($index)" class="btn btn-light btn-sm">Delete</button>
    </td>
</tr>
<button type="button" class="btn btn-dark" ng-click="eventCtrl.addOption()" id="addNewOption">+ Add New Answer Option</button>

2. 调整控制器逻辑(存对象而非字符串)

修改addOption方法,推入的是包含空text属性的对象,同时如果是从数据库加载的已有选项,也要确保它们是对象格式(比如后端返回的是字符串数组的话,在控制器初始化时转成对象数组):

myApp.controller('eventController', function() {
    let dash = this;

    // 初始化时:如果后端返回的是字符串数组,转成对象数组
    // 比如 dash.questionDetail.options = dash.questionDetail.options.map(str => ({text: str}));

    // 添加新选项:推入空对象而非空字符串
    dash.addOption = () => {
        dash.questionDetail.options.push({text: ''});
    };

    // 删除选项逻辑不变(根据索引删除)
    dash.removeOption = (index) => {
        dash.questionDetail.options.splice(index, 1);
    };

    dash.updateTheQuestion = () => {
        // 现在questionDetail.options已经是直接更新后的对象数组,提交时可以直接用
        // 如果后端需要字符串数组,这里可以转一下:
        // const optionsText = dash.questionDetail.options.map(opt => opt.text);
        apiService.updatequestion(dash.params.qid, dash.questionDetail).then(function successCallBack(response) {
            $rootScope.$broadcast("loader_hide");
            alert(response.data.message);
        });
    };
});

为什么这样有效?

对象是引用类型,ng-model绑定的是option.text——也就是数组中某个对象的属性,当你添加新元素触发ng-repeat重渲染时,原来的对象引用并没有改变,AngularJS能正确关联到之前的输入值,不会出现内容丢失的情况。同时,输入内容会直接同步到questionDetail.options数组里,不需要额外用newlyAddedOptions中转,最后提交的时候直接用原数组即可(如果后端需要纯字符串数组,在提交前用map转一下就行)。

内容的提问来源于stack exchange,提问作者Rahul jhawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:29