Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用纯javascript调用angular工厂_Javascript_Angularjs - Fatal编程技术网

使用纯javascript调用angular工厂

使用纯javascript调用angular工厂,javascript,angularjs,Javascript,Angularjs,我很难回答这个问题,但基本上我只是从angular开始,我使用的是ngMaterial。我有一个用角工厂制作的烤面包片 app.factory('notify', ['$mdToast', '$animate', function($mdToast, $animate) { return { showToast: function(msg) { var toast = $mdToast.simple() .co

我很难回答这个问题,但基本上我只是从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() {
              //
            });
        }
    }
}]);
如果我在页面上有一个按钮来激活toast,那么这个方法非常有效,但是我运行了socket.io,并且节点监视redis以获取更新,从而弹出该通知。然而,我不能让它工作,因为我不太确定如何从内部给工厂打电话

socket.on('notification.new', function (data) {        
    //call factory here to show toast
    console.log(data);
});
我知道如果我把它放在控制器上,我可以用

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

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

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

  • element(domeElement).scope()获取元素的当前作用域
  • angular.element(doElement).injector()获取当前应用程序注入器
  • element(domeElement).controller()获取ng控制器实例
在您的情况下,请使用
喷油器
服务了解您的工厂

更新1


我解决这个问题的方法是将控制器内的一个函数附加到
窗口
对象。大概是

window.showToast = function(msg) {
             var toast = $mdToast.simple()
                  .content(msg)
                  .action('Close')
                  .highlightAction(false)
                  .position('top right');
            $mdToast.show(toast).then(function() {
              //
            });
然后,从套接字io侦听器(或任何原始javascript)中:


这对我来说很管用。我知道这不是最好的方法,但因为这个问题根本没有任何答案,我想我会发布一个至少能完成工作的解决方案

有一个Angular套接字服务,你可以创建()-否则你可以使用
Angular.element
来定位控制器内的任何元素,并从中获取
范围。没有太多时间来编写完整的响应,但我认为你的问题是你试图将裸体JS与Angular进行接口。它不是专门为这个设计的。我将套接字抽象到angular服务中,将其注入到我想要使用它的任何控制器或服务中,并在那里设置侦听器。然后你也可以使用模拟套接字进行测试。感谢@tymeJV引导我走上正确的道路,找到了一种方法,可以轻松地将我需要的套接字函数包装成angular函数,然后就可以轻松地开始了。
socket.on('notification.new', function (data) {        
    //call factory here to show toast
    window.showToast(data); //or however you'd like
});