在库中加载视图,缓存变量的问题

Posted

技术标签:

【中文标题】在库中加载视图,缓存变量的问题【英文标题】:Loading view inside a Library, issues with cached vars 【发布时间】:2017-09-22 15:49:35 【问题描述】:

我正在尝试使用 load->view 来实现一个小部件库。我知道我可以使用 include 直接调用文件并避免 vars 缓存问题,但只是想知道为什么它不起作用。

这是我的代码结构:

我的控制器:

class Page extends MY_Controller 

    public $data = array();

    public function __construct() 
        parent::__construct();
        ...
        $this->load->library('widgetmanager');
    

    public function index($slug = '') 

        echo $this->widgetmanager->show(2);
        echo $this->widgetmanager->show(1);

    

我的图书馆

class WidgetManager


    private $CI;

    public function __construct()
    
        $this->CI = & get_instance();
    

    public function show($widget_id) 
        $data = array();
        $widget_id = (int)$widget_id;



        $this->CI->db->select('*');
        $this->CI->db->from('widget');
        $this->CI->db->where('id', $widget_id);

        $query = $this->CI->db->get();

        $item = $query->row_array();

        $data['widget_title'] = $item['title'];
        $data['widget_content'] = $item['content'];

        $widget =  $this->CI->load->view('widget/'.$item['source'], $data, TRUE);

        $data['widget_title'] = '';
        $data['widget_content'] = '';

        $this->CI->load->view('widget/'.$item['source'], $data);

        return $widget;
    

小部件 1:调用小部件/内容 小部件 2:调用小部件/横幅

发生的情况是,在第一个小部件调用上设置的变量(它们与第二个小部件调用同名)被缓存,这意味着来自第一个调用的值被传递给同一个调用。这很奇怪,因为是不同的观点。

我试过了:

使用 clear_vars():$this->CI->load->clear_vars(),在对库执行 load->view 之前和之后。 使用空数组、null 等调用 load->view 尝试将带有小部件 slug 的前缀添加到 vars(可行,但我必须以某种方式将前缀发送到视图,因此由于缓存问题而无法实现)

有什么想法吗?

【问题讨论】:

为什么在show()方法中加载两次视图? @DFriend 它是一种构建小部件的方法,我正在调用 2 个不同的小部件 是的,但是您在 show() 方法中加载了两次相同的视图。 @DFriend 不一样,source定义了哪一个,是动态的 不是你的编码方式。在函数show 内部,对load->view 的两个调用都使用$item['source'] 定义的相同文件。 【参考方案1】:

这是应该起作用的。

(我冒昧地简化了您的数据库调用,使其需要更少的处理。)

public function show($widget_id)

    $data = array();
    $widget_id = (int) $widget_id;

    $item = $this->CI->db
      ->get_where('widget', array('id' => $widget_id))
      ->row_array();

    $data['widget_title'] = $item['title'];
    $data['widget_content'] = $item['content'];

    $widget = $this->CI->load->view('widget/'.$item['source'], $data, TRUE);

    //clear the cached variables so the next call to 'show()' is clean
    $this->CI->load->clear_vars(); 

    return $widget;

进一步考虑 调用$this->CI->load->clear_vars(); 可能毫无意义,因为每次调用WidgetManager::show() 时都会使用完全相同的键重新创建$data var。当 $data var 传递给 load->view 时,$data['widget_title'] 和 $data['widget_content'] 的新值将使用这些键替换缓存 var 中的值。

【讨论】:

刚试了,可惜没用,老是这样。 我想确保我理解这个问题。您显示两个不同的小部件(不同的标题和内容)。但是两次显示的是相同的小部件内容? 非常感谢您花时间帮助我。我在“views”文件夹中有一个名为“widget”的文件夹。在其中,我有不同的文件,例如:内容、横幅、步骤。内容是我的通用小部件,用于大多数情况。我正在寻找加载这些小部件处理的内容,然后通过控制器中的操作页面/索引将它们加载到我的页面。 不客气。乐意效劳。我想我明白你的目标是什么。我试图准确了解显示的内容与您的预期不同。 在第一次调用时,变量:$widget_title 和 $widget_content 具有预期的值,在第二次调用中,相同的变量仍然具有第一次调用的值。

以上是关于在库中加载视图,缓存变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

在表格视图单元格中加载和缓存多个 UIImageView 不起作用

如何在视图启动之前在 SwiftUI 中加载更新的变量?

在 CI 模板加载器类中加载一个或多个视图

图像在 iframe 中加载后未从缓存中加载

从缓存中加载 webview

React Apollo 从缓存中加载数据然后发出请求