1

我有一个我在视图中显示的联系人组列表。当我单击联系人组时,我想更改当前哈希并加载关联的联系人。

说,我有 3 个联系人组

全部(无 ID)

朋友(ID := 1)

家庭(ID := 2)

其他(编号:= 3)

如果我单击好友,则 url 需要更改为 #/people/1 并且需要使用参数 (Id = 1) 调用回调。如果单击全部,则不应传递任何 ID (#/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/Contacts

如果我使用 DurandalJS 的 router.navigateTo,整个视图模型将被重新加载。有没有办法用 DurandalJS 做到这一点但不刷新视图模型?

4

1 回答 1

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 或超链接寻找朋友时,它应该只从 Web 服务器加载朋友数据,随后返回到同一屏幕时,朋友数据应该有它就不会一次又一次地加载。Durandal 将使用相同的虚拟机并且不会重置标志和可观察对象(除非并且直到您手动点击浏览器刷新按钮)。

于 2013-05-06T03:35:06.150 回答