如何在Angularjs中强制从指令事件中更新视图
How to force update view from directive event in Angularjs
我有一个工作,坚持了2天。希望每个知道angularjs的人都能帮助我:)。我需要强制改变html时,对模型的变化。例子:
这是html代码: <!--CAKE LIST-->
<div id="cakelist" ng-controller="CakeListCtrl">
<ul class="thumbnails cake-rack" cakes="cakes" ng-model="cakesModel">
<li class="pull-left cake-unit" ng-repeat="cake in cakes" cake="cake">
<div class="thumbnail">
<a href="{{cake.link}}">
<img ng-src="{{cake.avatar}}" alt="{{cake.title}}" class="img img-rounded img-polaroid" />
</a>
<h5 class="pull-left">
<a href="{{cake.link}}">{{cake.title}}</a>
</h5>
<a href="{{cake.linksearch}}" class="pull-right shared">Shared</a>
<div class="clearfix"></div>
<ul class="attrs unstyled">
<li>
<div class="pull-left">Mã sản phẩm</div>
<span class="pull-right">{{cake.type}}</span>
</li>
</ul>
</div>
</li>
</ul>
<input type="button" class="btn btn-primary" value="add more cake" class="cake-more" ng-click="addCake()" />
<input type="button" class="btn btn-danger" value="clear cake" class="cake-clear" ng-click="clear()" />
<img alt="Loading" src="/imagesroot/ajax-loader-1.gif" loading-stage="loadingStage" class="cake-loading"/>
</div>
现在在控制器外有一个菜单:
<div id="cake-catalog" class="cake-catalog">
<ul class="nav">
<li class="active">
<a cake-menu-unit href="sacmscategory50c2302b7ff0a">Nhân vật hoạt hình</a>
</li>
<li>
<a cake-menu-unit href="sacmscategory50c2308717a84">Động vật</a>
</li>
<li>
<a cake-menu-unit href="sacmscategory50c2309da00f6">Tạo hình 3D</a>
</li>
<li>
<a cake-menu-unit href="sacmscategory50c230ba08d9d">Các mẫu hình khác</a>
</li>
</ul>
</div>
我有angular模块添加和清除:
var CakeList = angular.module('CakeList', ['ngResource']);
CakeList.service('CakeService', function($rootScope) {
var cakedata = [{avatar:"test", title: "test2"}];
$rootScope.loadCake = false;
var bf = function() { $rootScope.loadCake=true; };
var at = function() { $rootScope.loadCake=false; };
return {
cakes: function() {
bf();
at();
return cakedata;
},
addCake: function() {
bf();
cakedata.push(cake);
at();
},
clear: function() {
cakedata = []; console.log('clear');
}
};
});
CakeList.directive('cakeCatalog', function($rootScope, CakeService) {
var clickfn = function(e) {
e.preventDefault();
CakeService.clear();
};
var nonclickfn = function(e) {
e.preventDefault();
console.log('nonclickfn');
};
return {
restrict: "C",
link: function(scope, element, attrs) {
$rootScope.$watch('loadCake', function(newValue, oldValue) {
if (newValue===true) {
element.find('a').off('click').on('click', nonclickfn);
}
else {
element.find('a').off('click').on('click', clickfn);
}
});
}
};
但是当运行时,我点击菜单的一个元素,然后列表不清楚,即使我在控制台框中检查console.log,看到蛋糕数据真的很清楚!你能帮我这个案子吗?:)
首先,到处使用$rootScope(以及其他东西)的设计看起来有点奇怪。但这并不是问题的根源。问题是$watch不正确。
首先,使用loadCake
作为对象而不是原始类型:
var loadCake = { loaded: false};
在$watch语句中使用objectEquality参数:
$rootScope.$watch('loadCake', function(newValue, oldValue) {
if (!newValue) return;
if (newValue.loaded === true) {
element.find('a').off('click').on('click', nonclickfn);
}
else {
element.find('a').off('click').on('click', clickfn);
}
}, true);
相关文章:
- 将click事件绑定到AngularJS指令中的子元素
- Angularjs事件与发布/订阅指令之间的通信
- 处理角度自定义指令中的onReady事件
- AngularJS指令中的动画,事件未启动
- 如何测试指令是否发出事件
- 使用 Angular 和 UI-bootstrap 对模态事件绑定无法工作的指令
- AngularJS:指令限制:“E”阻止在Jasmine单元测试中调用元素click()事件
- 获取 Angular UI-Calendar 上的所有事件(Arshaw 完整日历的指令)
- 如何在事件上对jquery上的ng模型进行指令更新
- AngularJS-将点击事件绑定到指令元素的子元素
- 角度指令:绑定'鼠标悬停'事件添加到元素
- 使用Angular Directive用$scope属性更新DOM-只要指令运行(无需等待事件)
- 如何在angularjs中的指令中注册click事件
- 创建一个模态指令,并将click事件绑定到angular js中
- AngularJS:如何从指令添加的元素中删除事件处理程序
- 在元素外部单击时激发事件的指令
- 触发特定路由的其他指令,如ng-init或事件,如stateChangeStart
- 避免通过指令中的事件传播进行自切换
- AngularJS - 指令事件和 DOM 渲染
- 如何在Angularjs中强制从指令事件中更新视图