【发布时间】:2015-06-25 08:22:39
【问题描述】:
有一个文本区域可以输入。还有两个按钮可以点击。
`<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',scope会保存'msg'。但是如果点击'cancel-btn',范围将不会保存消息。
我想要什么?
我保存完msg,然后输入并点击'cancel-btn',我希望textarea的innerHTML是scope.msg而不是input。
#
现在,我想执行 $scope.$apply() 来更新 dom,但警告错误 $digest already in progress。
#
也许我需要ng-model textarea,并使用另一个参数saved_msgsave msg,当点击'cancel-btn'时,制作msg = saved_msg。但是,有一些方便的方法吗?
-----------------更新 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 byjQuery` 改变 dom 类,当点击 'cancel-btn' 时,我想刷新 dom 决定范围。
它可能类似于 $render。
--------更新 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');
})
}
});
`
【问题讨论】:
-
ng-bind 基本上只绑定一次 msg 的值,而不是像 ng-model 那样不断地“更新”它。所以确实,我认为你应该使用 ng-model。
-
我很确定您希望在您的表单上显示
$setPristine()。见docs.angularjs.org/api/ng/type/form.FormController#! -
第二种方法是正常的做法。 ng-model 总是等于你在 textarea 中看到的,当你点击某个按钮时,你可以将它复制到其他变量。
标签: angularjs