【问题标题】:Preventing field input duplication across routes in AngularJS防止 AngularJS 中跨路由的字段输入重复
【发布时间】:2016-01-14 05:21:44
【问题描述】:

我有两个表单在我的应用程序的不同页面上相互重复,它们执行的功能略有不同。它们看起来像这样(去掉额外的代码):

<form role="form" name="myForm" ng-submit="processForm()"
    novalidate>
    <div>
        <fieldset id="basicForm">       
            <div id="firstname" class="form-group">
                <div class="input-group" id="inputSection">
                    <input id="firstNameInput" title="Input first name"
                        type="text" class="form-control form-custom basicInput"
                        name="firstname" placeholder="First Name"
                        ng-model="myForm.formData.firstname" maxlength="20"
                </div>
            </div>
        </fieldset>
    </div>
</form>

还有这个:

<form role="form" name="myFormCopy" ng-submit="processForm()"
    novalidate>
    <div>
        <fieldset id="basicForm">       
            <div id="firstname" class="form-group">
                <div class="input-group" id="inputSection">
                    <input id="firstNameInput" title="Input first name"
                        type="text" class="form-control form-custom basicInput"
                        name="firstname" placeholder="First Name"
                        ng-model="myFormCopy.formData.firstname" maxlength="20"
                </div>
            </div>
        </fieldset>
    </div>
</form>

如您所见,这些字段是相同的,只是表单具有不同的名称和不同的 ng-model。

我注意到,当从应用程序中的一个页面更改为另一个页面时,如果我在一个页面上的此字段中键入,该文本将自动出现在另一页面上的匹配字段中。尝试调试它,似乎一页上模型中的数据将在另一页上的模型中重复。

有没有办法避免这种情况?即使更改模型名称(例如 myForm.formData.firstname 和 myFormCopy.formData.firstnamecopy),每个模型中都只存在一个 firstname 和 firstnamecopy。这到底是怎么回事?

【问题讨论】:

  • 您拥有相同的ng-model,这就是为什么在两次更改中都显示相同的数据。基本上你需要更改其中一页的ng-model
  • 您最初是如何填充myForm 的?从您的描述看来,您最终将myFormmyFormCopy 引用到同一个javascript 对象。
  • @PankajParkar 如果你仔细观察,他们没有相同的 ng-model。
  • @DanielBeck 不确定我最初如何填充它是什么意思?然而,根据帕特里克在下面所说的话,听起来你是对的。

标签: javascript html angularjs forms


【解决方案1】:

您的变量“formData”很可能是两种表单的完全相同的对象实例。 对象在 javascript 中被引用,假设你这样做了

var o1 = { a: 99 };
var o2 = o1;
o2.a = 100;
console.log (o1);

然后你会得到 a 是 100,因为当你改变 o2 时,你也会改变 o1,因为它是同一个对象。 如果您不希望这种情况发生,您将不得不创建一个所谓的深层副本(如果您还不知道该术语,您将迫切需要搜索该术语) 的第一个对象。 如何做到这一点取决于您可以访问的允许框架。 例如,在 jQuery 中,这将是一个解决方案:

var newObject = jQuery.extend(true, {}, oldObject);

【讨论】:

  • 我最终不需要使用“深拷贝”,但是你让我意识到变量“formData”不像自动生成的那样,所以我只是创建了一个 formDataCopy 变量问题就解决了。不知道 Javascript 中的引用,所以谢谢!