0

我试图在我的 CI 视图中使用 javascript 每 2 秒更新(不刷新)一个数据模型,对于我的用例,其他用户可以更改数据库内容。

    <script type="text/javascript">
    var refreshFunc = setInterval(function() {
    <?php 
    $this -> load -> model('m_cube', '', TRUE);
    $stamp = $this -> $m_cube -> stamp();
    ?>
    var stamp = "<?php echo $stamp; ?>";
    console.log(stamp);             
    }, 2000);
    refreshFunc;
    </script>

我正在使用 JSsetInterval创建 2 秒循环,并调用 CI 模型从 Postgresql 数据库中检索数据。在简化的代码示例中,它只是向数据库询问时间戳。问题是写入控制台的时间戳没有更新——有些东西卡住了。

2013-10-21 14:35:54.168-04 
2013-10-21 14:35:54.168-04 
2013-10-21 14:35:54.168-04 
... 

查询真实数据表时的行为相同 - 它不返回最新值。

为什么模型访问数据库的“冻结”版本?

4

2 回答 2

2

它不是卡住或“冻结”,而是您对之前和之后的内容有些困惑。

我没有看到你使用 AJAX,所以当你的 php 被处理时(即,从 db 中获取并分配给 $stamp 的数据)页面 - html、css 和 javascript - 尚未生成和服务由服务器输出,也不由浏览器输出。

这意味着在您的 setInterval 中,您始终拥有相同的值,该值已经生成,因此您不断重新打印相同的字符串。

如果您想要继续更新,您需要不断向服务器请求数据,这就是 AJAX(异步 JavaScript 和 XML)可以派上用场的地方,因为它作为与主请求不同的请求运行,因此您可以处理两个不同的请求“级别”并获取内容,而页面的其余部分保持静态(已经提供并输出)。

如果您使用的是 jQUery,您可以查看$.ajax(),这使得这类事情变得非常容易。

于 2013-10-21T18:56:31.713 回答
0

当此脚本在服务器上运行时,它会获取模型数据并用<?php ?>结果替换标签。因此,对于客户端浏览器,它不是每 2 秒联系一次服务器,而是每 2 秒记录stamp一次值。如果您想更新它,您应该考虑使用Ajax技术。

于 2013-10-21T18:57:18.903 回答