2015-08-20 56 views
4

当用户关闭浏览器时,我想在窗口关闭之前运行一些代码,因为如果没有,则会导致其他用户出现问题。我正在处理的部分应用程序有一个随机视频聊天。房间由用户创建,当他们等待某人加入时,他们关闭浏览器选项卡/窗口,然后房间没有正确关闭,仍然可供其他用户加入。关闭窗口中的灰烬事件关闭

我见过很多使用beforeunload的例子,但他们只是不适合Ember工作。也许我错过了一个更加粗犷的做事方式,或者我需要依靠心跳方法?

我一直在试图做的是使用窗口beforeunload事件,但我一直没有任何运气。如果有更好的方法去解决我的上述问题,我全都是耳朵!

现在我在setupController方法结合,如:

$(window).bind('beforeunload', function() { 
    console.log('ending chat'); 
    this.endChat(); 
}); 

我也试过在路由这段代码,也许在视图中(在过去的一个月试了很多东西,我不记得一切)。

UPDATE:代码更新

这里是setupController参照控制器对象,而不是窗口。

setupController: function(controller, hash){ 

    $(window).on('beforeunload',() => { 
     controller.hasStarted ? controller.endChat() : controller.send('leaveChat'); 
    }); 

    $(window).on('click',() => { 
     controller.hasStarted ? controller.endChat() : controller.send('leaveChat'); 
     console.log('you just clicked'); 
    }); 
} 

的窗口中点击事件触发完美,但什么也没有发生在beforeunload事件 - 窗口刚刚关闭正常兵不血刃任何操作/方法。

回答

1

endChat在哪里定义?您目前写入的方式,this.endChat()被限定在窗口范围内。我猜你想要它的范围控制器或路线。

如果您使用灰烬CLI,您可以使用脂肪箭头语法留在外部范围是这样的:

// routes/application.js 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    setupController: function() { 
    $(window).on('beforeunload',() => { 
     this.endChat(); 
    }); 
    }, 

    endChat: function() { 
    // do the thing 
    } 
}); 

如果没有,那么你可以做的老式方法:

App.ApplicationRoute = Ember.Route.extend({ 
    setupController: function() { 
    var _this = this; 

    $(window).on('beforeunload', function() { 
     _this.endChat(); 
    }); 
    }, 

    endChat: function() { 
    // do the thing 
    } 
}); 

这是否行得通?

+0

它很接近!是的,事件在控制器上。我已经改变了它,但无法对beforeunload事件进行任何操作。我向窗口点击事件添加了另一个事件,以验证所有内容都正确连接,并且工作正常。但仍然没有任何关于beforeunload – awwester

+0

刚更新的问题与新的代码。谢谢! – awwester

0
export default Ember.Route.extend({ 
setupController: function() { 

    Ember.$(window).on('beforeunload', function(e){ 
     e.returnValue = "hi"; 
     return e.returnValue; 
    }); 

    } 

});