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中的路由器,但我不確定具體是什麼。
我覺得我錯過了你的問題中的一些事情,這涉及到路由器對象是什麼。也就是說,當您將'uniqueName:console.log(router)'和/或'uniqueName:console.log(router.navigationModel())'添加到您的錨點的數據綁定時,您在瀏覽器控制檯日誌中看到了什麼元件? –
當您不遵循MVC或MVVM類型模式時,'data-target'通常用於DOM操作或類似的事情。你在使用Durandal時想要完成什麼?爲什麼不按照慣例,在視圖模型中執行操作呢? –
@MajorByte,我還沒有嘗試過,但我確實看過出現的控制檯消息。有一個說「消息:'路由器'未定義」。這似乎是一個線索。現在看看。 – chuckw87