我试图在我的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>
我使用JS setInterval
创建2秒循环,并调用CI模型从Postgresql数据库中检索数据。在简化的代码示例中,它只是向DB请求时间戳。问题是写入控制台的时间戳没有更新 - 有些东西被卡住了。
2013-10-21 14:35:54.168-04
2013-10-21 14:35:54.168-04
2013-10-21 14:35:54.168-04
...
查询实际数据表时的行为相同 - 它不返回最新值。
为什么模型会访问数据库的“冻结”版本?
答案 0 :(得分:2)
它没有被卡住或“冻结”,而是你对之前和之后发生的事情产生了一些混淆。
我没有看到你使用AJAX,所以当你的php被处理时(即从数据库获取并分配给$ stamp的数据)页面 - html,css和javascript也 - 还没有由服务器生成和提供,也不由浏览器输出。
这意味着在setInterval中你总是有相同的值,它已经生成了,因此你不断重新打印相同的字符串。
如果你想继续更新,你需要继续向服务器请求数据,这就是AJAX(异步JavaScript和XML)可以派上用场的地方,因为它作为一个单独的请求从主服务器运行,所以你可以工作在两个不同的“级别”和获取内容,而页面的其余部分保持静态(已经提供和输出)。
如果你正在使用jquery,你可以查看$.ajax(),这使得这类事情变得非常简单。
答案 1 :(得分:0)
当此脚本在服务器上运行时,它会获取模型数据并将<?php ?>
标记替换为结果。因此,当涉及到客户端浏览器时,它不会每2秒与服务器联系,而是每2秒记录一次stamp
值。如果您希望更新它,您应该考虑使用 Ajax 技术。