2014-04-19 27 views
0

我有一個問題,我一直無法找到答案。數據綁定不綁定我的散列值

我有一個使用Hot Towel模板設置的項目。除了一條特定線路外,一切正在工作。它不會將屬性綁定到錨標籤。這裏是行:

<a class="nav-button" data-bind="attr: {'data-target': router.navigationModel()[1].hash, href: router.navigationModel()[1].hash }"> 

這似乎並沒有工作。這是,我通過它的視圖模型在shell.html調用像這樣一個觀點叫做導航:

<div data-bind="compose: 'viewmodels\\nav'"> 
</div> 

我想這是困惑我的部分是,當我在呼喚它像下面,這是工作:

<div data-bind="compose: { view: 'nav' }"> 
</div> 

我還證實,像這樣將綁定的屬性,調用視圖模型時:

<a class="nav-button" data-bind="attr: {'data-target': 'blah', href: 'blah'}"> 

它只是當我使用的路由器,而不是「嗒嗒」不起作用。有什麼不同,我必須做,當我調用viewmodel而不是視圖時,讓它工作。

作爲參考,這裏是我的路線設置。目前它非常簡單。

var routes = [ 
      { route: '', moduleId: 'home', title: 'Home', nav: 1 }, 
      { route: 'inbox', moduleId: 'SubNavigation/inbox', title: 'Inbox', nav: 2 }]; 

謝謝!

更新

做一些研究之後,我覺得我可能會使用的路由器是錯誤的。所以,我想寫出我在做什麼:

這裏是我的shell.js

define(['durandal/system', 'plugins/router', 'services/logger'], 
function (system, router, logger) { 
    var shell = { 
     activate: activate, 
     router: router 
    }; 

    return shell; 

    //#region Internal Methods 
    function activate() { 
     return boot(); 
    } 

    function compositionComplete(view, parent) { 
     $(".nav-button").on("click", function (event) { 
      showSubNav(this); 
      event.preventDefault(); 

     }); 
    } 

    function boot() { 
     //log('Hot Towel SPA Loaded!', null, true); 

     router.on('router:route:not-found', function (fragment) { 
      logError('No Route Found', fragment, true); 
     }); 


     var routes = [ 
      { route: '', moduleId: 'home', title: 'Home', nav: 1 }, 
      { route: 'inbox', moduleId: 'SubNavigation/inbox', title: 'Inbox', nav: 2 }]; 


     return router.makeRelative({ moduleId: 'viewmodels' }) // router will look here for viewmodels by convention 
      .map(routes)   // Map the routes 
      .buildNavigationModel() // Finds all nav routes and readies them 
      .activate();   // Activate the router 



    } 

    function log(msg, data, showToast) { 
     logger.log(msg, data, system.getModuleId(shell), showToast); 
    } 

    function logError(msg, data, showToast) { 
     logger.logError(msg, data, system.getModuleId(shell), showToast); 
    } 
    //#endregion 
}); 

這裏是我的nav.js

define(['services/logger'], function (logger) { 
var title = 'Nav'; 
var vm = { 
    activate: activate, 
    compositionComplete: compositionComplete 
}; 

return vm; 

//#region Internal Methods 
function activate() { 
    logger.log(title + ' View Activated', null, title, true); 
    return true; 
} 

function compositionComplete() { 
    $(".nav-button").on("click", function (event) { 
     showSubNav(this); 
     event.preventDefault(); 

    }); 
} 



function showSubNav(link) { 

    var target = $(link).data("target"); 

    $(".navigation-sub").removeClass("current"); 
    $(".active").removeClass(); 

    var isactive = $("body").find(".current"); 

    if (isactive.length == 0) { 
     $("body").addClass("subnav-active"); 
    } 

    $(target).addClass("current"); 
    $(link).addClass("active"); 


}; 
//#endregion 
}); 

我在想有什麼我需要在我的nav.js中使用shell.js中的路由器,但我不確定具體是什麼。

+0

我覺得我錯過了你的問題中的一些事情,這涉及到路由器對象是什麼。也就是說,當您將'uniqueName:console.log(router)'和/或'uniqueName:console.log(router.navigationModel())'添加到您的錨點的數據綁定時,您在瀏覽器控制檯日誌中看到了什麼元件? –

+0

當您不遵循MVC或MVVM類型模式時,'data-target'通常用於DOM操作或類似的事情。你在使用Durandal時想要完成什麼?爲什麼不按照慣例,在視圖模型中執行操作呢? –

+0

@MajorByte,我還沒有嘗試過,但我確實看過出現的控制檯消息。有一個說「消息:'路由器'未定義」。這似乎是一個線索。現在看看。 – chuckw87

回答

0

我通過將我的shell視圖模型中的路由器代碼移到nav viewmodel中來實現此目的。這正在完成我想要做的事情。只是基本上越來越熟悉框架,我想。我認爲我絕對必須在我的shell視圖中設置我的路線。謝謝!