1

在下面的代码中,只有在从 Gmaps 导航器上的调用中获得 valuea 后,我才需要渲染视图。在我拥有纬度和经度之前,我无法渲染视图。在这里跟随一些答案我被错误困住了

对象 [object global] 没有方法 'afterRender 感谢您的任何建议。

initialize: function() {
    $.when(this.beforeRender).then(function(){
        this.afterRender();
    });
},

beforeRender: function () {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(this.onSuccessUpdatePos, 
                                                 this.onFailUpdatePos);
    } else {navigator.geolocation.getCurrentPosition(this.onSuccessUpdatePos, 
                                                     this.onFailUpdatePos);

    }
},

afterRender: function () {
    this.render();
},

更新:我照我说的做了,而且似乎尊重了 BeforeRender-> render-> afterRender 的顺序。我还在函数 Initialize() 中添加了所有初始化逻辑。问题在于,将函数按顺序排列似乎并不能确保函数 render() 一旦获得结果就会启动。

我也试过了

    $.when(this.beforeRender).then(that.render);

正如向我建议的那样,但仍然不断给我错误。似乎 beforeRender 没有启动。不断向我展示的错误是

Uncaught SyntaxError: Unexpected token u

我认为这是由于 sessionStorage 和 localStorage 而发生的,并且在启动渲染功能之前没有填充这些内容。有没有一种有效的方法来等待这些结果返回?

4

2 回答 2

2

我认为您遵循了一些教程,因为 Backbone 核心中不存在 beforeRender 和 afterRender。但是,它们通常由需要在渲染例程之前和之后触发事件的人实现。

此外,Backbone 将 View 类的渲染函数留空,因此您可以在需要时实现(甚至调用它)。

作为旁注,将 render() 直接调用到 initialize() 函数中通常并不好,因为您通常需要在初始化视图后对何时以及如何渲染视图进行更多控制。

也就是说,我建议:

  • 将所有初始化逻辑(如您的导航器检查)移动到 initialize();
  • 在视图之外调用 render() (在你的 new ViewName() 调用之后)

如果你真的需要(可能是为了进一步开发你的代码)在回调之前之后,你可以使用 Underscore(因为它是一个依赖项而可用)“wrap”函数。这种方法包括:

initialize: function() 
    this.render = _.wrap(this.render, function(render) {
        this.beforeRender();
        render();                       
        this.afterRender();
    });

}, 
render: function() {},
beforeRender: function() {},
afterRender: function() {}

考虑到这一点,我会选择(记得在 View 类上指定一个onFailUpdatePos ):

initialize: function() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(this.render, this.onFailUpdatePos);
    } else {
        navigator.geolocation.getCurrentPosition(this.render, this.onFailUpdatePos);
    }
}
于 2013-05-19T22:47:34.253 回答
0

out of context inside then

试试这个。在调用它之前保存它的引用

initialize: function() {
    var thisView = this;
    $.when(this.beforeRender).then(function(){
        thisView.afterRender();
    });
},
于 2013-05-19T22:40:07.420 回答