javascript - AngularJS:在文本字段中更改 ng-model 时设置单个表单字段的样式

标签 javascript html css angularjs

所以我已经问过几次类似的问题,恐怕我不够具体。

假设在我的 Controller 中有一个名为“guy”的人类型对象,如下所示:

{"ID"        : "1234",
 "firstName" : "Bob",
 "lastName"  : "Michael",
 "phone"     : "555-555-5555",
}

(注意:我正在使用的对象与此相似 -- 但它要大得多)

现在假设我有一个带有表单和搜索框的网页。表单为对象中的每个属性都有一个字段,如下所示:

<label for="inputFirstName"> First Name: </label>
<input type="text" id="inputFirstName" ng-model = "person.firstName">

<label for="inputLastName"> Last Name: </label>
<input type="text" id="inputFirstName" ng-model = "person.lastName">

<label for="inputPhone"> Phone Number: </label>
<input type="text" id="inputPhone" ng-model="person.phone">

当在页面上搜索“ID”号码时,表单会填充对象中的相应数据。页面上还有一个“导入”按钮。当按下这个按钮时,一个人对象被带到 Controller 中,除了 firstName 现在是“Dan”而 phone 现在是“111-111-1111”之外,它与 guy 相同。变量“guy”被设置为等于这个新导入的对象,有效地改变或“更新”了这些变化的对象。正如预期的那样,这些更改会立即显示在表单中。

我希望能够在按下导入按钮后突出显示已更改的字段。但是,我的尝试没有成功。我试着做这样的事情:

 <label for="inputFirstName" 
        ng-class = "{ 'newCSS' : !!hasChanged }"> 
    First Name: 
 </label>
 <input type="text" 
        id=inputFirstName" 
        ng-model="person.firstName" 
        ng-change = "hasChanged = true">

但这仅在我手动在文本框中键入更改时有效——在我单击导入按钮并且实际对象本身已更改时无效。之前问这个问题的时候,有人建议我这样使用$watch:

Controller 函数 demoCtrl ($scope) {

$scope.$watch('myModel', function (newValue, oldValue) {
    if (newValue) {
       $scope.hasChanged = true;
    }
 }, true);

$scope.changeMyModel = function () {
   $scope.myModel = 'wonderful';
 };

}

HTML

  <label for="stuff" ng-class="{ 'newCSS' : !!hasChanged }">Stuff</label>
  <input type="text" id="stuff" ng-model="myModel" ng-change="hasChanged = true">

  <button ng-click="changeMyModel()">change model</button>

</div>

但这也行不通。一方面,当我按下按钮时 $watch 似乎没有注册,所以我还没有让它成功运行。另一方面,我不确定这对我正在尝试做的事情有何影响。假设我所有的标签/输入都是这样设置的,即使只有一个字段被更改,难道不会突出显示所有字段,因为如果新对象的一个​​属性与旧对象不同, hasChanged 将切换为 true 吗?

Bleh..我只是有点困惑。我将如何成功实现呢? (即导入更改时,已更改的字段会突出显示)

最佳答案

在过去,为了实现这一点,我使用 Angular.copy 在范围内创建对象的副本,然后比较原始对象和当前对象。

像这样

Controller

$scope.originalPerson = $angular.copy($scope.person);

查看

<label for="inputFirstName" 
       ng-class="originalPerson.firstName == person.firstName ? oldCss:newCss">
        First Name:
</label>

关于javascript - AngularJS:在文本字段中更改 ng-model 时设置单个表单字段的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124804/

相关文章:

c++ - 用于私有(private)、 protected 和公共(public)元素的 Doxygen 自定义 CSS

html - 启用 offcanvas 菜单时链接不起作用

javascript - 在 Spotify API Javascript 中搜索轨道 + 添加到服务器

javascript - 更改元素的背景颜色?

javascript - 使用 d3.csv 读取键值对

javascript - 如何指定每一步滚动移动多少像素?

javascript - 使用 jquery 更改背景图像颜色?

从 HTML 链接时,javascript 文件不起作用

html - 如何实现Jquery noconflict

html - 不同颜色的CSS下拉菜单