2013-05-07 2 views
1

나는 Durandal과 Knockout을 사용하여 건물을 짓고있는 응용 프로그램을 가지고 있으며 내 SPA에서 페이지 중 하나에 듀란 댈 탐색을 사용할 때 문제가있는 것으로 보입니다. 홈 화면에서 응용 프로그램을로드하고 일련의 계단식 드롭 다운이있는 두 번째 페이지로 이동하면 바인딩이 끊기는 것처럼 보입니다. 페이지를 새로 고치고 바인딩으로 시작하는 두 번째 페이지를로드하면 모두 예상대로 작동하는 것 같습니다. 첫 번째 페이지에는 현재 제목 외에는 아무 것도없고 두 번째 페이지에는 계단식 드롭 다운이 있습니다. 솔직히이 질문에 어떤 코드를 포함 시킬지 모르겠다. 사람들이보고 싶은 것이 있으면 언제든지 물어보십시오. '녹아웃 컨텍스트'Chrome 플러그인을 사용하여 녹아웃 컨텍스트를 엿보는 중입니다. 결과가 표시되지 않는다는 점을 제외하면 모든 것이 작동하는 것처럼 보입니다.Durandal이 녹아웃 바인딩을 방해합니까?

더 간단보기 모델 데 문제

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가 사전로드 된 observableArray 인 경우

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

당신은 '페이지'Viewmodels 모듈과 같은 몇 가지 코드를 포함해야합니다, 나는 문제를 갖는 viewmodels의 더 간단한을 추가 한 것을 당신의 활성화 기능 – 7zark7

+0

를 호출합니다. activate 함수를 호출하는 것을 참조 할 때 router.map 호출로 shell.js에 대해 이야기하고 있습니까? – PlTaylor

+0

"datacontext.lookups.manufacturers"가 ajax 또는 비동기 호출인지 궁금합니다. 그렇다면 활성화 된 통화에서 약속을 되 찾을 것으로 예상 될 때 저의 트로피가 날 것입니다. – 7zark7

답변

0

, 당신은 아마 당신의 활성화를 변경해야 다음과 같다 함수 :

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

datacontext.lookups.manu 의 facturers는 웹 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

+0

내 viewmodel 파일에 세미콜론이없는 경우 몇 가지 문제가 발생했습니다. 모든 함수의 끝에 세미콜론이 있는지 확인하십시오. –

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

+0

OOTB Durandal을 사용하여 datacontext 요청을 모형으로 만들고 테스트 케이스를 만들 수 있습니까? 이 저장소 (https://github.com/dFiddle/dFiddle-1.2)는 진행 중이며 깊이있는 문서가 부족하지만 여기에서 논의 할 수있는 테스트 케이스를 만드는 가장 빠른 방법 일 것입니다. – RainerAtSpirit

+0

OOTB? 나는 그것이 도움이된다고 생각한다면이 문제를 재현하려는 바이올린에 대한 작업을 시작할 수 있습니다. – PlTaylor

관련 문제