如何在范围未更改时更新视图

时间:2015-06-25 08:22:39

标签: angularjs

有一个textarea输入。并点击两个按钮。

      `<textarea ng-bind="msg"></textarea> 
       <div class="cancel-btn" ng-click="is_hide=false;"></div>
       <div class="submit-btn" ng-click="submit_card()"></div>`

过程是什么?

在textarea中输入一些字符,然后点击'submit-btn',范围将保存'msg'。但是如果点击'cancel-btn',范围将不会保存消息。

我想要什么?

保存msg后,输入并单击'cancel-btn',我想textarea的innerHTML是scope.msg而不是输入。

现在,我想执行$scope.$apply()更新dom,但警告错误$digest already in progress

也许我需要ng-model textarea,并使用另一个参数saved_msg保存msg,点击'cancel-btn'后,点msg = saved_msg。但是,有一些方便的方法吗?

------------------- update 6/25 -----------------

`<div ng-controller="Ctrl">
 <div ng-class="{'selted':cid == 0}" data-cat="0"></div>
 <div ng-class="{'selted':cid == 1}" data-cat="1"></div>
 <div ng-class="{'selted':cid == 2}" data-cat="2"></div>
 <textarea ng-bind="msg"></textarea> 
 <div class="cancel-btn" ng-click="is_hide=false;"></div>
 <div class="submit-btn" ng-click="submit_card()"></div>
 </div>

In fact, I use some directive by jQuery`改变dom类,当点击'cancel-btn'时,我想刷新dom决定范围。 它可能类似于$ render。

-------------------- update 6/26 -------------- 谢谢您帮忙。我找到了解决问题的方法。我添加一个div#main来包含我想要保存/刷新的内容。 ps:关心一些变化! 以下是我的方式。也许你有更好的方式,欢迎分享!

`<div ng-controller="Ctrl">
 <div id="main">
 <div ng-class="{'selted':cid == 0}" data-cat="0" selt></div>
 <div ng-class="{'selted':cid == 1}" data-cat="1" selt></div>
 <div ng-class="{'selted':cid == 2}" data-cat="2" selt></div>
 <textarea ng-bind="msg" id="msg"></textarea>
 </div> 
 <div class="cancel-btn" ng-click="reset()"></div>
 <div class="submit-btn" ng-click="submit_card()"></div>
 </div>`

在控制器中,

`app.controller('Ctrl', ['$scope', '$compile', function($scope, $compile)           {
    $scope.reset = function(){ //reset depend on scope
        $('#main div').removeClass('selted');  
    //the dom maybe change, need clear 'selted' class first
     //compile(dom)(scope) 
        $('#main').html($compile($('#main').html())($scope));
    }
    $scope.save = function(){  //save the scope
        $scope.msg = $('#msg').val();
        $scope.cid = $('.selted').index()+1;  
    }
}]);

app.directive('selt', function(){  
  //this is directive, only change class on dom
    return function(scope,ele){
        ele.click(function(){
            ele.addClass('selted').siblings().removeClass('selted');
        })
    }
});

`

1 个答案:

答案 0 :(得分:0)

1 - 您需要将ng-bind的{​​{1}}替换为textarea,以便在您输入时更新范围。

2 - 要提供类似ng-model,请以简单的方式将cancel内容替换为ng-click等功能。在您的控制器中:

cancel(formName)

angular.module('exampleApp', []) .controller('Ctrl', ['$scope', function ($scope) { $scope.is_hide = false; $scope.msg = null; $scope.cancel = function cancel (form) { $scope.is_hide = true; $scope.msg = null; if (form) { form.$setPristine(); } }; }]); 参数是您在formName上使用的包装器form元素的名称,用于访问某些特定属性,例如HTML,这会将$setPristine处理重置为其初始状态。注意:这并不意味着将重置字段值