2012-08-28 57 views
0

我目前正在使用Backbone編寫應用程序,出於某種原因,它不更新視圖,但僅在某些情況下。Backbone model.change()not firing

如果我在index.html#/ blog/2上刷新頁面,它會加載頁面很好,一切都很好。但是,如果我在index.html#/ blog/1處刷新頁面,然後將URL更改爲index.html#/ blog/2並按Enter(不刷新),則更改永遠不會被觸發。

這是我的路由器:

makeChange: function() { 

    // Set activePage to the current page_id => /blog/2 
    var attributes = {activePage: this.page_id}; 
    var $this = this; 

    // Loop through all sections in the app 
    app.sections.some(function(section) { 

     // Check if section has the page 
     if(!section.validate(attributes)) 
     { 

      // If it has, set the activePage to /blog/2 
      section.set(attributes, {silent: true}); 
      // Set active section to whatever section-id was matched 
      app.set({activeSect: section.id}, {silent: true}); 

      console.log('Calling change!'); 

      // Calling change on both the app and the section 
      app.change(); 
      section.change(); 

      console.log('Change complete!'); 

      return true; 

     } 

    }); 

} 

這是應用程序視圖(被稱爲「應用程序」中引用了上述^):

var AppView = Backbone.View.extend({ 

    initialize: function(option) { 

     app.bind('change', _.bind(this.changeSect, this)); 

    }, 

    changeSect: function() { 

     var newSect = app.sections.get(app.get('activeSect')); 
     var newSectView = newSect.view; 

     if(!app.hasChanged('activeSect')) 
      newSectView.activate(null, newSect); 

     else 
     { 

      var oldSect = app.sections.get(app.previous('activeSect')); 
      var oldSectView = oldSect.view; 

      newSectView.activate(oldSect, newSect); 
      oldSectView.deactivate(oldSect, newSect); 

     } 

    } 

}); 

告訴我,如果你需要看一些其他的類/模型/視圖。

+0

檢查該模型具有實際上已更新。也許你應該綁定到集合呢? –

+0

首先是應用程序模型?試圖弄清楚你在上面做什麼。無論如何,當瀏覽網址(無需刷新),您的控制檯被稱爲?如果它是一個模型或集合,它不應該有所作爲。您仍然可以綁定到更改並重置事件。 – TYRONEMICHAEL

+0

@GregRoss @TyroneMichael「app」是AppView的一個實例,所以它是Backbone.View的擴展。我將如何檢查視圖是否已更新?我嘗試'router.log(this.page_id)'在router.makeChange()中,所以我知道我在設置activePage並輸出/ blog/2,所以它**應該**已被更改,但沒有任何其他方式確認它,我不能確定。至於控制檯被調用的問題,我該如何確定?它輸出「呼叫改變!」以及「更改完成!」這是在router.makeChange()輸出,所以路由器至少被調用.. – Tanax

回答

1

我解決了!這隻發生在同一部分的不同頁面之間導航(通過更改部分中的activePage),所以應用程序中的activeSect從未更改過,因此從未稱爲changeSect()。現在,即使activeSect在應用程序中相同,且activePage在該部分中已更改,它仍會在應用程序中調用changeSect()。

在第二節的模型,添加此:

initialize: function() { 

    this.pages = new Pages(); 
    this.bind('change', _.bind(this.bindChange, this)); 

}, 

prepareForceChange: function() { 

    this.forceChange = true; 

}, 

bindChange: function() { 

    console.log('BINDCHANGE!'); 
    if(this.forceChange) 
    { 

     AppView.prototype.forceChange(); 
     this.forceChange = false; 

    } 

}, 

在router.makeChange()以上這樣的:

section.set(attributes, {silent: true}); 
app.set({activeSect: section.id}, {silent: true}); 

我加入:

var oldSectId = app.get('activeSect'); 
if(oldSectId == section.id) section.prepareForceChange();