2013-03-15 68 views
2

我使用Durandal模板与一起工作Visual Studio 2012 MVC4项目。在这个模板中,shell.js页面为我们提供了一个非常简单的菜单解决方案,其中每个元素都位于顶部。我个人需要不同的东西。为此,我有一个名为dropdown.js的javascript文件,它允许我显示/隐藏子菜单。它在一个标准项目中工作得很好,但我无法使用durandal模板进行操作。使用带有durandal模板的自定义JavaScript脚本文件

这里是我的尝试:

我加入到Index.chtml的dropdown.js脚本参考:

<script src="~/Scripts/dropdown.js"></script> 

然后在shell.html页,我想用它是这样的:

<li class="dropdown" data-role="dropdown"> 
    ... 
    ... 
</li> 

这里是dropdown.js的小部分:

$(function() { 
    alert('XXXX'); 
    $('[data-role="dropdown"]').each(function() { 
     alert('YYYY'); 
     $(this).Dropdown(); 
    }) 
}) 

正如你所看到的,每个用'dropdown'类装饰的元素都应该被捕获。它不适用于durandal。我放置了一些警报框来检查它。显示警报“XX”,但从未显示警报“YY”。

我搜索了一堆没有成功的小时。

有什么想法?

回答

1

我认为问题是,当dropdown.js函数在菜单呈现之前执行,并且因为jquery选择器没有捕获任何列表项。

我认为你最好的选择是做一个淘汰赛的绑定来改变你的下拉列表中的项目。

的结合看起来是这样的:

ko.bindingHandlers.dropdown= { 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     $(element).Dropdown(); 
    }, 
    update: function (element, valueAccessor) { 
    } 
}; 

并在视图:

<li class="dropdown" data-bind="dropdown : {}"> 
    ... 
    ... 
</li> 
+0

很多谢谢你!它工作得很好。 – Bronzato 2013-03-15 09:34:51

3

退房的生命周期事件塔T优能够领略到了Durandal here

viewAttached可以帮助因为当视图和dom准备就绪时你可以使用它。

+0

我使用'viewAttached'来完成任务,但根据[github](https://github.com/BlueSpire/Durandal/issues/74#issuecomment-14291074)上的讨论,自定义绑定或Durandal小部件在沿着这条路线前应首先考虑。 – RainerAtSpirit 2013-03-17 14:01:04

+0

这取决于...如果你只需要等待DOM准备好,viewAttached就可以了。如果您需要更多,绑定是理想的。 – 2013-03-17 14:04:11

+0

并非我理解Rob的建议的方式,但我不得不承认,根据Durandal的理念,该文档并非完全清楚何时使用哪个挂钩来工作。 – RainerAtSpirit 2013-03-17 14:42:12