2013-04-08 3 views
1

У меня есть список групп контактов, которые я показываю на виду. Когда я нажимаю на группу контактов, я хочу изменить текущий хэш и загрузить связанные контакты.DurandalJS - перемещаться без viewmodel refresh

Скажем, у меня есть 3 группы контактов

Все (не Id)

Друзья (Id: = 1)

Семья (Id: = 2)

Другие (Id: = 3)

Если я нажимаю «Друзья», необходимо изменить URL-адрес на #/people/1, и необходимо вызвать обратный вызов с параметрами (Id = 1). Если нажать «Все», ни один идентификатор не должен быть передан (#/people), чтобы загрузить все контакты.

Что-то вроде:

router.when("#/people/:id", function (routeData) { 
    console.log(routeData.Id); //Output: 1 

    // Load contacts by id 
}); 

router.when("#/people", function() { 
    // Load all contacts 
}); 

function onContactGroupClick(contactGroup) { 
    router.navigateToWithoutReset("#/people/" + contactGroup.Id); 
} 

Причина заключается в том, что я хотел бы иметь центральное место, где это не имеет значения, если вызов выполняется с помощью кода или вручную (изменить URL-адрес, или нажмите на гиперссылка).

Хорошим примером является Gmail/Контакты

Если я использую router.navigateTo из DurandalJS, весь вид модели будет перезагружен. Есть ли способ сделать это с DurandalJS, но без обновления модели представления?

ответ

1

Что вы подразумеваете под центральным расположением?

Из того, что я понимаю, это то, что вы ищете:

define(["services/dataservice"], function (dataservice) { 
     var allContacts = ko.observableArray(); 
     var friendsContacts = ko.observableArray(); 
     var contacts = ko.observableArray(); 
     var loadedAllData= false; 
     var loadedFriends = false; 
     var vm = { 
      activate: activate, 
      contacts: contacts, 
     }; 
     return vm; 

     function activate(routeData) { 
      var id = parseInt(routeData.id); 
      if(id === 1) 
      { 
       if(loadedFriends) 
       { 
        //push friends observable into contacts 
       } 
       else 
       { 
        //load friends from server and set loadedFriends to true. 
       } 
      } 
      else 
      { 
       if(loadedAll) 
       { 
        //push all contacts this into the contacts array 
       } 
       else 
       { 
        //load from the webserver, and also filter friends and put them into friends observable. Here set both loadedAll and loadedFriends to true. 
       } 
      } 
     } 
    } 
); 

Итак, если вы связывание вашего взгляда с контактами тогда, когда первый раз, когда вы пришли к этому экрану ищет друг из URL или из гиперссылка должна просто загружать данные друзей с веб-сервера, при последующих возвратах к тем же файлам друзей на экране должно быть, что они не будут загружаться снова и снова. Durandal будет использовать тот же vm и не будет сбросить флаги и наблюдаемые (если только вы не перейдете вручную и не нажмете кнопку обновления браузера).

Смежные вопросы