在rendr控制器中未定义localStorage

时间:2015-11-01 01:04:01

标签: javascript node.js backbone.js local-storage rendr

我在我的Rendr应用程序的控制器中获得了module.exports = { show: function(params, callback) { var spec = { model: { model: 'Company', params: { name: params.id } } }; var options = {}, Authorization = localStorage.getItem('Authorization'); options.header = { "Authorization": Authorization } this.app.fetch(spec, options, function (err, results) { // return if there is an error fetching the user if (err) return callback(err); // set the title of the page to the users name this.app.set('title', results.model.get('name')); // render the page with the results from the fetch callback(null, results); }.bind(this)); } }; 。我试图从localStorage获取我的授权令牌,并在我获取规范之前将其设置为标题。我也尝试过window.localStorage,但后来我没有定义窗口。我是否无法访问控制器级别的窗口对象?如果没有,我将如何从localStorage获取。

这是我的控制器代码。

const unsigned int BitsPerByte = CHAR_BIT;
unsigned char byte;
for (size_t i = 0; i < data.size(); ++i)
{
    if ((i % BitsPerByte) == 0)
    {
        // first bit of a byte
        byte = 0;
    }
    if (data[i] == '1')
    {
        // set a bit to 1
        byte |= (1 << (i % BitsPerByte));
    }
    if (((i % BitsPerByte) == BitsPerByte - 1) || i + 1 == data.size())
    {
        // last bit of the byte
        file << byte;
    }
}

1 个答案:

答案 0 :(得分:1)

欢迎来到Rendr :-)

Rendr是Isomorphic(或#34; Universal),这意味着它的很多代码都在服务器和浏览器中运行。如果您只想在浏览器上运行代码,则有两种方法可以实现:

  1. 在视图中有一个名为postRender的自定义方法 - 该方法不在服务器上运行,只能在浏览器上运行。它是放置所有浏览器特定代码的标准位置。缺点是它在页面呈现后运行。

  2. 您可以将代码包装在if (window !== 'undefined') {...}中,以确保它只在浏览器中运行。缺点是它永远不会在服务器上运行。

  3. 在我们的Rendr应用程序中,我们使用localstorage做了一些,有点必须将它楔入基本模板的顶部。它有点奇怪,因为localstorage(浏览器具有持久性)的概念与同构应用程序的概念(服务器和浏览器可以是相同的)相抗衡。所以他们不能很好地合作。