Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DomReady with backbone.js_Backbone.js_Backbone Views_Domready - Fatal编程技术网

DomReady with backbone.js

DomReady with backbone.js,backbone.js,backbone-views,domready,Backbone.js,Backbone Views,Domready,我正在使用backbone.js创建一个单页应用程序。我是新手,所以请原谅任何错误的语义 我的问题是渲染视图时 最初,我在index.html中有一个javascript,它执行一些dom操作(图像滑块) JS被包装在$(window.load()中,因此在初始化时一切都正常。 除非页面是从url加载的,否则代码显然不会执行。代码不会从主干视图或路由器运行。因此页面加载时不需要dom操作 我尝试将代码插入视图中的render和initialize函数,但没有成功。我应该将此代码添加到路由器吗?这

我正在使用backbone.js创建一个单页应用程序。我是新手,所以请原谅任何错误的语义

我的问题是渲染视图时

最初,我在index.html中有一个javascript,它执行一些dom操作(图像滑块)

JS被包装在$(window.load()中,因此在初始化时一切都正常。 除非页面是从url加载的,否则代码显然不会执行。代码不会从主干视图或路由器运行。因此页面加载时不需要dom操作

我尝试将代码插入视图中的render和initialize函数,但没有成功。我应该将此代码添加到路由器吗?这似乎有点像黑客

我应该在哪里包含“dom就绪”代码? 和/或是否有更好的方法来管理主干中加载的视图及其dom元素

守则:

home.js

window.HomeView = Backbone.View.extend({
initialize:function () {
    this.render();
},

render:function () {
    $(this.el).html(this.template());

    this.startOrbits();
    return this;
},



startOrbits:function(){
    $(window).load(function() {
        $('#orbit-main').orbit({ fluid: '16x6', swipe:true });
        $('#orbit-news').orbit({ fluid: '8x6', bullets: true, directionalNav:false, captions:true, advanceSpeed: 9000});
    });
},




});
但是当我转到另一个视图,然后返回时,代码显然没有 激发

我不太清楚那是什么意思。撇开“兴奋”部分不谈,你不会“去”视图;视图只是向页面添加元素或向现有元素添加逻辑的方法

如果让我猜的话,我会想象你正在使用主干路由器在虚拟“页面”之间移动(你使用视图来创建这些页面)。如果是这种情况,您需要查看主干路由器事件:

具体来说,我认为您需要将事件处理程序(在路由器上)绑定到“route:nameOfYourRoute”或“just:route”(如果您希望在每次虚拟页面加载时触发逻辑)


希望这有帮助,如果我的猜测是错误的,请编辑您的问题以澄清。

我找到了解决方案。 在我的路由器函数中注释掉if语句后,事情进展顺利

 home: function () {
            // if (!this.homeView) {
                this.homeView = new HomeView();
            // }
            $('#main-content').html(this.homeView.el);
            this.homeView.startOrbits();
            this.headerView.selectMenuItem('home');
        },
我确实意识到这意味着我在每个路由触发器上创建了一个新视图。
请随时提供更多的最佳解决方案。

您不应该
这个。$(“#orbit main”)。orbit(…)
在适当的
渲染
方法中?只需将它放在
#orbit main
的后面
中即可。$el
@mu太短:我添加了这个。startOrbits在渲染函数中,我还尝试添加了inner initialize after render();。代码在新视图渲染之前运行。请仔细阅读我的评论:
$(x) 
和是不同的东西。
$(x)
仅在
x
位于DOM中时才起作用,
此。$(x)如果
x
this.el
内,即使
this.el
尚未添加到DOM中,也可以使用
。我不知道我可以这样做。感谢您指出。不幸的是,这不起作用,我收到一个错误,说轨道不是函数。不过我在下面找到了一个解决方案。谢谢您的输入。很抱歉类型o。我的意思是执行。是的,你正确理解了我。我使用主干路由器运行基于url标记的页面。问题是,我试图找到一种在视图呈现后运行代码的方法。在路由器中添加代码将触发逻辑,但有点太早,页面尚未呈现。我很困惑:你真的尝试了我的方法吗建议?路由事件在应用路由回调后触发;代码实际上是
回调和&callback.apply(this,args);this.trigger.apply(this,['Route:'+name].concat(args));
因此,在事件处理程序中添加的任何逻辑都将在视图呈现后触发(当然,假设您在路由的回调中调用呈现)。我能够确定一个解决方案。我在路由器中有一个if语句,我对此进行了注释。这样,每次触发路由器函数时都会生成一个新视图,而不是使用“缓存”命令“视图。解决方案如下。这是最优的吗?我也在尝试应用和理解您提出的解决方案。我应该在哪里添加代码?感谢您的耐心。很高兴您解决了问题:-)每次创建一个新视图没有什么错(除非您经常这样做并且不清理引用),但这似乎是不必要的。通过注释指出,
如果
你说的是“每次都创建一个新视图”,如果它是您想要的,这很好……但我认为您真正想要的是每次都重新渲染:您当前正在通过创建新视图、调用其初始化并触发其渲染来执行此操作。如果保留if,则代码可能会更干净,但添加了一个else块,该块执行了
this.homeView.render()你可能想考虑编辑你的问题来使事情更清楚,包括(仅)。相关代码,仅供将来可能来到这里的读者使用。此外,您应该接受自己的答案,以便此问题不会停留在未回答的问题队列中。但是,如果您发现我的答案很有用,欢迎您投票:-)