2013-05-07 126 views
1

我有一個應用程序,我正在使用Durandal和Knockout構建,並且在我的SPA中使用durandal導航到其中一個頁面時似乎存在問題。當我從主屏幕加載應用程序並導航到具有一系列級聯下拉菜單的第二頁時,它看起來好像綁定斷開。如果我刷新頁面並加載第二頁開始使用綁定,則所有這一切似乎都按預期工作。第一頁除了標題外沒有任何內容,第二頁有級聯下拉菜單。老實說,我不確定在這個問題上包含什麼代碼,所以如果有人想看看,請隨時提問。我使用「Knockout Context」Chrome瀏覽器插件查看Knockout上下文,除了結果未顯示外,一切似乎都正常。Durandal干擾敲除綁定?

即是具有simplier視圖模型問題

define(['services/logger', 
    "services/datacontext"], 
function (logger, datacontext) { 
    var manufacturers = ko.observableArray(); 
    var manufacturer = ko.observable(); 
    var isSaving = ko.observable(false); 
    var modelsWithSizes = ko.observableArray(); 

    manufacturer.subscribe(function (newValue) { 
     datacontext.getBikeModelsWithSizes(modelsWithSizes, newValue.manufacturerID()); 
    }); 


    var hasChanges = ko.computed(function() { 
     return datacontext.hasChanges(); 
    }); 

    var cancel = function() { 
     datacontext.cancelChanges(); 
    }; 

    var canSave = ko.computed(function() { 
     return hasChanges() && !isSaving(); 
    }); 

    var save = function() { 
     isSaving(true); 
     return datacontext.saveChanges().fin(complete); 

     function complete() { 
      isSaving(false); 
     } 
    }; 

    var canDeactivate = function() { 
     if (hasChanges()) { 
      var title = 'Do you want to leave ?'; 
      var msg = 'Navigate away and cancel your changes?'; 
      var checkAnswer = function (selectedOption) { 
       if (selectedOption === 'Yes') { 
        cancel(); 
       } 
       return selectedOption; 
      }; 
      return app.showMessage(title, msg, ['Yes', 'No']) 
       .then(checkAnswer); 

     } 
     return true; 
    }; 

    var vm = { 
     activate: activate, 
     cancel: cancel, 
     canDeactivate: canDeactivate, 
     canSave: canSave, 
     hasChanges: hasChanges, 
     manu: manufacturer, 
     manufacturers: manufacturers, 
     modelsWithSizes: modelsWithSizes, 
     save: save 
    }; 

    return vm; 

    //#region Internal Methods 
    function activate() { 
     manufacturers(datacontext.lookups.manufacturers), 
     logger.log('Frames View Activated', null, 'frames', false); 
     return true; 
    } 


    //#endregion 
}); 

DataContext的通話如下

datacontext.lookups = { 
    manufacturers: function() 
    { return getLocal('Manufacturers', 'name', true); } 
}; 
+0

你需要包括像「頁」的ViewModels模塊的一些代碼,什麼叫你激活功能 – 7zark7 2013-05-07 01:12:03

+0

我已經添加了更簡單的有問題的ViewModels的。當你提到調用activate函數的東西時,你是否正在用router.map調用談論shell.js? – PlTaylor 2013-05-07 01:20:08

+0

我很好奇,如果「datacontext.lookups.manufacturers」是一個Ajax或異步調用?如果是這樣的話,那就是絆倒了我,因爲你預計會從激活的呼叫中返回一個承諾。 – 7zark7 2013-05-07 05:30:02

回答

0

如果datacontext.lookups.manufacturers是預裝的observableArray,你可能需要改變你的激活函數爲:

function activate() { 
    vm.manufacturers(datacontext.lookups.manufacturers()); 
    logger.log('Frames View Activated', null, 'frames', false); 
    return true; 
}; 

如果datacontext.lookups.manu facturers是一個異步調用Web API,你會想將其改爲:我不使用的微風,所以我不知道,如果是getLocal()異步或不

function activate() { 
    logger.log('Frames View Activated', null, 'frames', false); 
    return datacontext.lookups.manufacturers().then(querySuccess); 

    function querySuccess(data) 
    { 
     vm.manufacturers(data.results); 
    }; 
}; 
+0

這是一個預加載的數組,我把它變成了一個函數,並將它包含在原始問題中。 – PlTaylor 2013-05-07 11:09:45

+0

當我的viewmodel文件中缺少分號時,我遇到了一些問題。儘量確保所有函數都有一個結尾分號。 – 2013-05-22 05:51:53

0

,但如果有疑問返回包裹$.when(syncOrAsync).then(...)

function activate() { 
    var manufacturesPromise = datacontext.lookups.manufacturers(); 
    logger.log('Frames View Activated', null, 'frames', false); 

    return $.when(manufacturesPromise).then(function(results){ 
     manufacturers(results); 
    }); 
} 
+0

這使得很多感覺。但是當我執行它時,我的綁定仍然被破壞,我不知道爲什麼。 – PlTaylor 2013-05-08 11:54:33

+0

您可以使用OOTB Durandal模擬datacontext請求並創建測試用例嗎?這個repo(https://github.com/dFiddle/dFiddle-1.2)正在進行中,缺乏深入的文檔,但它可能是產生可在此討論的測試案例的最快方法。 – RainerAtSpirit 2013-05-08 17:45:46

+0

OOTB?如果你認爲這會有所幫助,我可以開始嘗試重現這個問題。 – PlTaylor 2013-05-08 18:14:34