可以从控制器更新工厂,但不能从指令更新
Can update factory from controller but not from directive
我正试图创建一个可以从应用程序中任何地方调用的Modal模块,但我遇到了一个问题,可能会突出我的误解,但我看不清它是什么。
以下是我努力实现的目标:http://jsfiddle.net/dwSX8/2/
当我从控制器更新ModalAPI时,一切都按预期进行,但当我从指令中更新时,什么都没有。
所以我的HTML是:
<div ng-app="app">
<div ng-controller="AppCtrl">
<button ng-click="logout()">Via Controller</button>
<button logout>Via Directive</button>
</div>
<modal></modal>
</div>
和我的Angular JS东西:
angular.module('Modal', [])
.factory('ModalAPI', function () {
return {
title: 'Before click',
open: function(title){
console.log('new title: ' + title);
this.title = title;
}
}
})
.directive('modal', function(){
return {
restrict: 'E',
scope: {},
replace:true,
controller: function($scope, ModalAPI){
$scope.m = ModalAPI;
$scope.$watch('modal.title', toggle);
function toggle() {
console.log(' ---------- Modal changed!!!!');
};
},
template: '<div>{{m.title}}</div>'
};
})
angular.module('app', ['Modal'])
.controller('AppCtrl', function ($scope, ModalAPI) {
$scope.logout = function(){
console.log('clicked');
ModalAPI.open('After controller click')
}
})
.directive('logout', function(){
return{
restrict: 'E',
link: function($scope, element, ModalAPI) {
element.bind('click', function(){
ModalAPI.open('After directive click')
})
}
}
})
您应该在声明指令的地方注入服务,而不是在链接函数中。链接函数中的第三个参数是元素的属性。
.directive('logout', function(ModalAPI){
return{
restrict: 'E',
link: function($scope, element) {
element.bind('click', function(){
ModalAPI.open('After directive click')
})
}
}
})
绑定事件不在Angular的范围内Angular不知道事件已被触发。
因此,您必须将调用封装在$apply函数中:
$scope.$apply(function(){
element.bind('click', function(){
ModalAPI.open('After directive click')
})
});
进一步阅读:$scope
相关文章:
- JS可以在Chrome中工作,但不能在Firefox中工作
- WebRTC视频聊天可以在FF中使用,但不能在Chrome中使用
- jQuery Datepicker可以在Safari中工作,但不能在FF或Chrome中工作
- 三角库可以与firefox一起使用,但不能在Chrome中使用
- Highcharts可以从服务器加载数据,但不能更新
- 刷新GoogleMaps tile服务器可以使用JavaScript,但不能使用GWT
- node.js可以识别字符模式,但不能识别数字模式
- 如何在元素中处理鼠标事件,但不能在其子元素上处理
- Json到CSV下载,可以在chrome中工作,但不能在IE浏览器中工作
- jQuery$.post可以在chrome、safari中工作,但不能在FF中工作(声明成功回调函数未定义)
- Javascript可以在chrome中使用,但不能在其他浏览器中使用
- Iframe加载调整大小在Chrome中工作,但不能在IE或Firefox中工作
- Rails Production-可以工作,但不能编辑/删除/创建记录
- 能够在Highcharts中看到值,但不能看到图形
- Django,HTML,JS:<img src=“#">可以在HTML中工作,但不能在JS文件中工作
- 通过Javascript SDK登录Facebook可以在移动设备和本地主机上使用,但不能在台式机上使用
- jQuery/Javascript函数可以在Chrome中使用,但不能在IE11中使用
- 可以从控制器更新工厂,但不能从指令更新
- jquery html更新可以在电脑上使用,但不能在智能手机上使用
- Flash播放器”;数据“;更新在FF中工作,但不能在x浏览器(twitch)中工作