AngularJS视图没有'当ng模型值发生变化时,t更新
AngularJS view doesn't update when ng-model value changed
请检查此代码笔,当单击按钮单击我重置名称时,名称输入应重置为空,当我在指令范围上执行console.log
时,我确实看到name
设置为空字符串,但视图中的值不会更新。怎么了?
CodePen示例
angular.module('mainApp', [])
.directive('myTab', function() {
return {
restrict: 'E',
template: 'name: <input type="text" ng-model="name">',
controller: function($location, $scope) {
$scope.name = 'myname';
$('#clickMeToReset').on('click', function() {
$scope.name = '';
})
}
};
})
.directive('myMenu', function() {
return {
restrict: 'E',
template: '<button id="clickMeToReset">click me to reset name</button>'
};
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="mainApp">
<my-menu></my-menu>
<my-tab></my-tab>
</div>
之后
$scope.name = '';
进行
$scope.$apply();
当您在angular中使用其他库(如jquery)时,会更改变量(如$scope
应手动广播。
$('#clickMeToReset').on('click', function(){
$scope.name = '';
$scope.$apply();
})
所以$scope.$apply();
会成功的!
使用以下内容修改控制器代码:
controller: function($location,$scope, $timeout){
$scope.name = 'myname';
$('#clickMeToReset').on('click', function(){
$timeout(function() {
$scope.name = '';
});
})
}
angular.module('mainApp', [])
.directive('myTab', function() {
return {
restrict: 'E',
template: 'name: <input type="text" ng-model="name">',
controller: function($location, $scope, $timeout) {
$scope.name = 'myname';
$('#clickMeToReset').on('click', function() {
$timeout(function() {
$scope.name = '';
});
})
}
};
})
.directive('myMenu', function() {
return {
restrict: 'E',
template: '<button id="clickMeToReset">click me to reset name</button>'
};
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="mainApp">
<my-menu></my-menu>
<my-tab></my-tab>
</div>
由于您使用jQuery来更改值,这超出了Angular的上下文,所以Angular不知道更改。所以你需要告诉Angular有些事情已经改变了。因此,我们使用$timeout
服务来实现这一点。我们也可以使用$scope.$apply()
,但当摘要周期已经在进行时,这可能会失败。
重要
您应该使用ng-click
,并在可能的情况下删除jQuery的依赖关系,因为jQuery本身也是一个像Angular一样的大型库(请参阅下面的工作示例):
angular.module('mainApp', [])
.directive('myTab', function() {
return {
restrict: 'E',
template: 'name: <input type="text" ng-model="name">',
controller: function($scope) {
$scope.name = 'myname';
$scope.clearName = function() {
$scope.name = '';
}
}
};
})
.directive('myMenu', function() {
return {
restrict: 'E',
template: '<button ng-click="clearName()">click me to reset name</button>'
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script>
<div ng-app="mainApp">
<my-menu></my-menu>
<my-tab></my-tab>
</div>
我希望根据我的想法,这段代码能帮助你。只有更改Js代码剩下的HTML代码才是正确的。
var mainApp = angular.module('mainApp', []);
mainApp.directive('myTab', function() {
return {
template: 'name: <input type="text" ng-model="name">',
controller: function($location,$scope){ debugger;
$scope.name = 'myname';
$('#clickMeToReset').on('click', function(){
$scope.name = '';
})
}
};
})
.directive('myMenu', function() {
return {
name:"clickMeReset",
template: '<button id="name" ng-click="clear()">click me to reset name</button>',
controller:
function($location,$scope){
$('#name').on('click', function(){
$scope.name = '';
})
}
};
});
相关文章:
- GoogleMapsForRails-只有在搜索结果发生变化时才通过ajax更新标记
- AngularJS视图没有'当ng模型值发生变化时,t更新
- ReactJS-这个状态中的数组在删除时被正确更新,但结果是't,直到以后的状态发生变化
- Ng重复不随数组变化而更新
- 如何在数量发生变化时自动更新合计
- 如何在 AngularJs 中的数据库发生变化时立即实现自动视图更新
- AngularJS:如何在指令范围的对象发生变化时更新与控制器作用域相关联的控制器作用域
- 当Firebase数据发生变化时,Google 图表不会更新
- 一旦 JavaScript 中任何 HTML 元素的值发生变化,就会更新画布
- 检索到的 $().position() 更新为 position: absolute 后发生了变化
- 添加标记并在纬度和经度变化时更新标记
- Angular ngClass 没有更新我的类,即使我的条件按预期发生了变化
- Angularjs 指令更新到 DOM 属性值的变化
- 当角度$scope发生变化时,不要更新 HTML
- Spotfire Java脚本将字段拆分为唯一值,并每30秒更新一次MapChart可视化,以反映值的变化
- 范围变量以角度更新,但变化不会反映给用户
- 可观测集合发生变化时更新Div
- 用ng变化更新角度模型
- 根据可观察到的变化更新相关属性
- 粘头不会根据我的变化更新