繁体   English   中英

用纯JavaScript调用angular工厂

[英]Call angular factory with pure javascript

我很难为这个问题命名,但是基本上我只是从angular开始,并且正在使用ngMaterial。 我有一个用角工厂创建的吐司

app.factory('notify', ['$mdToast', '$animate', function($mdToast, $animate) {
    return {
        showToast: function(msg) {
             var toast = $mdToast.simple()
                  .content(msg)
                  .action('Close')
                  .highlightAction(false)
                  .position('top right');
            $mdToast.show(toast).then(function() {
              //
            });
        }
    }
}]);

如果我在页面上有一个按钮可以激活吐司,那么这很好用,但是我同时运行socket.io以及节点监视redis,以更新弹出该通知。 但是我不能使它正常工作,因为我不确定如何从这里调用该工厂

socket.on('notification.new', function (data) {        
    //call factory here to show toast
    console.log(data);
});

我知道我是否可以在控制器上使用它

angular.element().scope().showToast(data)

但是我不想创建一个元素只是为了容纳控制器来调用函数。

解决此问题的方法是将控制器内部的功能之一附加到window对象。 所以像

window.showToast = function(msg) {
             var toast = $mdToast.simple()
                  .content(msg)
                  .action('Close')
                  .highlightAction(false)
                  .position('top right');
            $mdToast.show(toast).then(function() {
              //
            });

然后,从套接字io侦听器(或与此相关的任何原始javascript)中:

socket.on('notification.new', function (data) {        
    //call factory here to show toast
    window.showToast(data); //or however you'd like
});

这样对我有用。 我知道这不是最好的方法,但是由于这个问题根本没有任何答案,因此我认为我将发布一种变通办法,至少完成此工作。

您需要掌握Angular服务,才能在原始Javascript中使用Angular。

请参阅从旧版代码调用Angular JS

  • angular.element(domElement).scope()获取元素的当前范围
  • angular.element(domElement).injector()获取当前的应用程序注入器
  • angular.element(domElement).controller()来获取ng-controller实例的所有权。

在您的情况下,请使用injector服务来控制您的工厂。

更新1

$ injector参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM