2014-12-29 3 views
1

이것은 아마도 프레임 워크에 대한 질문보다는 코드 구조의 문제 일 수 있습니다.상위 라우터 활성화 기능은 하위 경로를 탐색 할 때마다 실행됩니다.

기본적으로 자식 라우터 중 하나를 탐색 할 때마다 상위 라우터의 activate 기능을 호출해야하는지 궁금합니다.

내 목표 : 하위 라우터를 반환하는 모듈이 있어야합니다.이 라우터는 상위 라우터입니다. 이 상위 라우터는 사용자가 새로운 것을 추가하는 경우 객체를 생성하거나 사용자가 이미 존재하는 것을 선택하는 경우 서버에서 데이터를 검색하는 역할을 담당합니다. 자식 라우트 모듈은 상위 라우터 모듈을 통해 생성되거나 검색된 객체를 간단히 가져오고, ko 데이터 바인딩을 통해 해당 객체를 조작하기위한 양식 입력을 제공합니다. 내가 겪고있는 문제는 부모 라우트의 activate 함수가 자식 경로가 탐색 될 때마다 호출되는 것으로, 생성/검색 논리가있는 곳이며 객체가 다시 검색되어 데이터 조작을 덮어 씁니다. 내가 아이를 활성화하기 전에 부모에게 때마다 활성화와 아무 잘못이 있다고 생각하지 않습니다

// ParentRouter 
define([...], function(...) { 
    var selectedObj = ko.observable(null), 
     configRouter = router.createChildRouter() 
      .makeRelative({ 
       moduleId: 'viewmodels', 
       fromParent: true, 
       dynamicHash: ':id' 
      }).map([ 
       { 
        route: ['Settings 1', ''], 
        moduleId: 'SettingsOne', 
        nav: true 
       }, 
       { 
        route: 'Settings 2', 
        moduleId: 'SettingsTwo', 
        nav: true 
       }, 
       { 
        route: 'Settings 3', 
        moduleId: 'SettingsThree', 
        nav: true 
       } 
      ]).buildNavigationModel(); 

    function getSelectedObj() { 
     return selectedObj; 
    } 

    return { 
     router: configRouter, 

     obj: selectedObj, // privileged property which is accessed by other modules via the getSelectedObj method, this prop gets set in the activate function depending on the param 
     getSelectedObj: getSelectedObj, // method which returns the current selected obj 

     activate: function (objId) { 

      if (objId == 'New') { 

       // create a new object with default props 

      } else { 

       // retrieve the data for the selected obj from API via the 'objId' param 

      } 

     } 
    } 
}); 



// SettingsOne module - child route module 

define(['viewmodels/parentRouter'], function(parentRouter) { 

    // this module simply gets a property from the parent routers module and binds it to form inputs in its View (which update automatically) so the user can edit information on that obj 


    var obj = parentRouter.getSelectedObj(); // get the current selected obj via parent routers module method 

    return { 
     obj: obj 
    } 
}); 


Below is the shell module of my app, showing the main application router. 
// Shell.js 
define([ 
    'plugins/router' 
], function (router) { 
    var routes = [ 
      { 
       route: '', 
       moduleId: 'viewmodels/home' 
      }, 
      { 
       route: ':id*configs', 
       moduleId: 'viewmodels/parentRouter' 
      } 
     ]; 

    return { 
     router: router, 
     activate: function() { 
      return router.map(routes) 
        .mapUnknownRoutes('viewmodels/notfound', 'not-found') 
        .activate(); 
     } 
    } 
}); 

답변

0

: 아래

잘하면 더 잘 설명하기 위해 몇 가지 코드입니다. 당신이 다시 발생하는 retreval하지 않을 경우, 예를 들어, 조건부합니다

define(function (require) { 
    var 
     $ = require('jquery'), 
     Q = require('q'), 

     activate = function() { 
      return load(); 
     }, 

     loadPromise = null, 

     load = function() { 
      return loadPromise || (loadPromise = Q($.get('/my/api')) 
        .then(function (data) { 
         //use data; 
        })); 
     }; 

     return { 
      activate: activate 
     } 
}); 
+0

대단히 감사합니다. 그것은 기본적으로 현재 내가하고있는 일입니다. durandal 디자인에 의한 것 같은 기분이 들지 않았습니까? –

0

를 내가 내 부모 VM이 다시 호출 활성화를하지 않으 유사한 문제에 직면하고있다. durandal의 문서에서이 지원되어야처럼 소리입니다 : 모듈이 그와 관련된 하위 라우터를 가지고

From Module Reuse heading here

합니다. 인스턴스가 보관됩니다.

나는 이것이 내가 스스로 일할 수는 없었다고 말했지만, 나는 그것이 당신에게 질문하는 것으로 생각합니다. Durandal은이 기능을 지원하려고 시도하지만, 우리 모두가 누락되어 있다는 약간의 뉘앙스가 있습니다. 알아 내면 여기서 업데이트 할 것입니다.

+0

그게 좋을거야! 고맙습니다. –

관련 문제