AngularJS ng-class,表单很脏时的条件

时间:2013-07-24 14:39:29

标签: javascript angularjs

在我的主html中(假设它使用ng-controller =“controller1”),我想在div上放置一个条件类,只要ng-controller =“controller2”下的表单改变了它的背景颜色很脏。

有没有办法把它作为条件语句放在ng-class中?

将会有多种形式和多个需要协调的相关div,所以我只想尝试最简单的方法。

编辑 - 我当前设置的示例代码:

HTML:

<html ng-app="testapp">
<body ng-controller="ControllerA">
    <p ng-class="{'updates-made' : boolUpdatesMade}">
        My background will change whenever an update is made on the form
    </p>

    <form name="editForm" ng-controller="ControllerB">
        <input type="text" name="changeme">
        <button ng-click="save()">Save</button>
    </form>
</body>
</html>

Controller.js:

testapp.controller("ControllerB", function($scope){
    $scope.save = function(){
        if($scope.editForm.$dirty){
            $scope.boolUpdatesMade = true;
        }

    }
}

我期望发生的是当我在ControllerB中设置boolUpdatesMade = true时,CSS类“updates-made”将应用于HTML中的

。事实并非如此。

以下是此示例的JSFiddle链接:http://jsfiddle.net/tPGLT/1/

2 个答案:

答案 0 :(得分:3)

Angular已经在一个名为“ng-dirty”的类中添加了一个表单(以及单个字段),只要它被触摸了......假设你有一个表单元素来附加它。最简单的方法是创建一个CSS类,其中包含您想要的任何样式。如果您更喜欢自己的类,则可以使用ng-class来评估表单状态:

<form name="my_form" ng-class="{'class-name' : my_form.$dirty}">

编辑:

刚刚看到你想要一个不同的div。假设Div与表单位于同一个控制器下,这仍然有效:

<form name="my_form">

<div ng-class="{'class-name' : my_form.$dirty}">

如果div与表单的控制器范围不同,它仍然可以,但您必须使用事件或服务在两个控制器之间进行通信。

现在喝咖啡。看到你想要在控制器之间进行通信,你可以在另一个答案中使用$ watch技术来看模型是否已经改变(因为$ watch不能在表单状态下工作)然后使用服务或$ broadcast / $ emit在另一个控制器中设置var。

答案 1 :(得分:2)

父控制器无法判断子控制器内的模型何时更改而不使用$ watch。

(在这种情况下,被观看的模型不是太大。但是,值得注意的是该文档的内容: “要保存对象的值以供以后比较,请使用angular.copy函数。 这也意味着观看复杂的选项会对内存和性能产生不利影响。“)

有一种更简单的方法可以在不使用$ watch的情况下做你想做的事情:

testapp.controller("ControllerA", function($scope){     
    $scope.boolUpdatesMade = false;

    $scope.updateForm = function(){
        $scope.boolUpdatesMade = true;
    }
}

testapp.controller("ControllerB", function($scope){
    $scope.save = function(){       
        if($scope.editForm.$dirty){
            // dont update the parent's model inside the child
            // instead have the parent's method do that
            $scope.updateForm();
        }
    }
}

希望这有帮助。