• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

将不显眼的JavaScript与Pusher结合起来

ruby-on-rails 来源:user94154 3次浏览

我使用Pusher为我的Rails应用添加实时页面更新。将不显眼的JavaScript与Pusher结合起来

这里有一个如何推进器工作(我以后会告诉你我想它做什么)的简短概要:

控制器:

class ThingsController < ApplicationController 
    def create 
    @thing = Thing.new(params[:thing]) 

    if @thing.save 
     Pusher['things'].trigger('thing-create', @thing.attributes) 
    end 
    end 
end 

的Javascript(在<head>...</head>):

var pusher = new Pusher('API_KEY'); 
var myChannel = pusher.subscribe('MY_CHANNEL'); 
myChannel.bind('thing-create', function(thing) { 
    alert('A thing was created: ' + thing.name); // I want to replace this line 
}); 

我想用ajax请求替换注释行来触发一些不显眼的JavaScript。假设我有一个文件的应用程序/视图/事/ index.js.erb的:

$("things").update("<%= escape_javascript(render(@things))%>"); 

我应该在myChannel.bind回调触发上面的代码执行写?


===========解决方案如下:

你不是真的在这里比较苹果对苹果。

您正在将在XHR请求中呈现的模板与things/index@thing对象的属性从POST比较为things/create

您需要处理在Web浏览器中从Pusher返回的thing对象,并相应地修改DOM。

或者,更简单的解决方案可能是让您的控制器将格式化的HTML发送到Pusher而不是对象属性。然后,您的JavaScript代码可以插入格式化的HTML,而不是尝试解析thing对象并手动修改DOM。


回应@ user94154的评论:

免责声明:我从来没有听说过推,直到你的问题。

这确实会创建一个挑战b/c,通常你的HTML格式化在视图中,但你必须从控制器发送数据到Pusher。我可以想到几个方法来做到这一点:

  1. 如果它不是很多的HTML标记,你可能想打破“不要重复自己”的规则,并重复您的控制器中的HTML标记,并发送对推者
  2. 如果它是很多标记,我会将我的视图生成代码抽象为助手。您也可以通过您的控制器呼叫帮手。

在客户端,您应该有一个空的div(或某个DOM元素),它可以容纳来自Pusher的HTML。而做这样的事情:

myChannel.bind('thing-create', function(thing) { 
    $("div#thing_holder").html(thing.html); 
}); 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)