2013-07-01 57 views
1

我有一個視圖&視圖模型需要有條件地填充數據。我注意到viewAttached覆蓋只在每個視圖中被調用一次...因此最初是我所有init調用的合理位置,因爲數據幾乎是靜態的。Durandal:查看模型激活/初始化階段

但是在我將數據從另一個視圖傳遞到屏幕的情況下,激活的調用在viewAttached之前觸發...因此如果用戶在...之前沒有導航到視圖...他們的選擇將不被選擇因爲init函數不會被調用。

我的問題如下:

其中鉤將被認爲是最相關的一個用來執行任意淘汰賽綁定,或如何修改執行順序,如果我做...事情會爆炸嗎? :P(與工作部件的框架擺弄,可能在不穩定的代碼結束)

視圖模型

var vm = { 
     lookups: lookups, 
     userInfo: userInfo, 
     buttons: buttons, 

     viewAttached: function (view) { 
      $('.date').datepicker().on('show', function (ev) { 
       var today = new Date(); 
       var t = today.getFullYear() + "-" + today.getMonth() + '-' + today.getDate(); 
       $(this).data({ date: t }).datepicker('update'); 
      }); 

      console.log('viewAttached'); 
      console.log(view); 


      // should this move to the activate function? 
      lookupInit(); 
     }, 

     activate: function (data) { 

      console.log('activate'); 
      console.log(data); 

      var id = data.id || undefined; 

      if (id !== undefined) { 
       router.isNavigating(true); 
       http.json('/api/user/' + id) 
        .done(function (response) { 
         ko.viewmodel.updateFromModel(vm.userInfo, response); 
         router.isNavigating(false); 
        }); 
      } 
     } 
    }; 

回答

2

所有數據檢索操作應該activate處理。如果依賴多個呼叫,您可能必須鏈接多個呼叫,或者使用$.when並行多個呼叫。在Durandal 1.2中。請務必從激活中返回true,false或承諾,讓Durandal知道何時允許繼續撰寫。

viewAttached的最佳做法是使用傳入的view限制jQuery選擇器,否則您可能會意外影響視圖外的元素。例如

viewAttached: function (view) { 
$('.date').datepicker().on('show', function (ev) ... 

將成爲

viewAttached: function (view) { 
$('.date', view).datepicker().on('show', function (ev) ... 

viewAttached: function (view) { 
$(view).find('.date').datepicker().on('show', function (ev) ... 
+0

希望我能接受這兩個答案。比你 :) –

1

ViewAttached每次在視圖附着到DOM時間調用,所以它會被稱爲每個每次你瀏覽視圖。 ViewAttached始終在激活後調用。

要執行init操作,可以通過在activate函數中聲明一個全局布爾變量來實現。

如:

function activate() 
{ 
    if(notInit){ /* do stuff */ 
     notInit = true; 
    } 
    /* do stuff */ 
} 

請看看下面的鏈接瞭解Durandal的看法生命週期:

http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks/

http://durandaljs.com/documentation/View-Model/

+0

謝謝!偉大的建議 –