javascript - 可以从 Controller 更新工厂,但不能从指令更新工厂

标签 javascript angularjs

我正在尝试创建一个可以从应用程序中的任何位置调用的模态模块,但我遇到了一个问题,该问题可能突出了我的误解,但我看不到它是什么。

这是我想要实现的目标的 jsFiddle:http://jsfiddle.net/dwSX8/2/

当我从 Controller 更新 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')
            })
        }
    }
})

最佳答案

您应该在声明指令的位置注入(inject)服务,而不是在链接函数中。链接函数中的第三个参数是元素的属性。

.directive('logout', function(ModalAPI){
    return{
        restrict: 'E',
        link: function($scope, element) {
            element.bind('click', function(){
                ModalAPI.open('After directive click')
            })
        }
    }
})

关于javascript - 可以从 Controller 更新工厂,但不能从指令更新工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541326/

相关文章:

angularjs - Angular-DataTables 自定义过滤器

javascript - 如何限制用户在 ui-ace 编辑器中只写一个 javascript 函数(方法)

javascript - 如何重新启用 event.preventDefault?

javascript - 如何使用 PhantomJS 启动 Angular 摘要循环?

javascript - 文本区域中的复制粘贴在 Chrome 中不起作用

javascript - 你如何在 glsl/webgl 中将一个 32 位的整数打包成 4 个、8 位的整数?

javascript - 在 Angular Directive(指令)中动态包含标记上的函数

javascript - 在 {} 和链接中为 Angular Directive(指令)定义隔离范围变量之间的区别

javascript - : Ember. js, Canjs, Angular.js 哪个JavaScript框架更适合新手?

javascript - 使用工厂 AngularJS 提供处理后的数据