knockoutjs点击绑定在嵌套的foreach中不起作用

时间:2012-05-15 11:10:06

标签: javascript jquery asp.net-mvc-3 knockout.js knockout-2.0

所以我有一个非常奇怪的问题,一个knockoutjs点击绑定没有附加到锚标签。其他data-bind =“”有效,但不是点击绑定。

下面你可以看到HTML和viewmodel js文件的一部分

var tag = function (data) {
    this.count = data.Count;
    this.id = data.Id;
    this.title = data.Title;
    this.tagGroup = data.TagGroup;
};
 var tagContainer = function (data) {
    this.tagList = $.map(data.Tags, function (item) { return new tag(item); }); 
    this.letter = ko.observable(data.Letter);
};

var searchViewModel = function(){
   var self = this;

   self.tagContainerList = ko.observableArray([]); 

   self.addFilter = function (tag) { 
    //move tag to active filters and do some more cool stuff here 
    };


};

<div id="modal-all-tags" data-bind="with:searchViewModel">
    <ul data-bind="foreach:tagContainerList">
        <li>
            <span data-bind="text:$data.letter()"></span>
            <ul data-bind="foreach:tagList">
                <li><a href="#" data-bind="click:$root.addFilter"><span data-bind="text:title"></span></a></li>

            </ul>
        </li>
    </ul>

      <a class="close-reveal-modal">&#215;</a>
</div>

基本上它是一个模态弹出窗口,当用户单击页面上的链接时会加载它。 我向服务器发送一个请求,它返回一个标签容器列表,每个容器都有起始字母和要在字母下面呈现的标签列表,如下所示: 一个  一句话1  一句话2 乙  b字1  b字2 C  c字1  c word 2

依旧......

字母正确呈现A,B,C,每个字母都会在文本正确显示的情况下获得正确的标记列表:

除了addFilter()之外,其他一切都有效;我希望绑定到taglist中每个链接的函数。浏览器只是跳起来并向网址添加一个哈希字符。 Firebug也没有在绑定上显示任何错误。

div容器具有with:searchViewModel的原因是因为整个页面都有一个主视图模型。但这并不重要,因为它正在处理项目的每个其他页面。

我能想到的唯一一点就是点击绑定$ root.addFilter是错误的但我只是尝试了addFilter,其中firebug给出了错误“addFilter not defined;”

我尝试了$ parent和$ root。

有人有任何建议吗?

3 个答案:

答案 0 :(得分:15)

我以为有过这样的想法。您的addFilter函数需要一个参数(tag),但您没有在绑定中传递任何内容:

<a href="#" data-bind="click:$root.addFilter">

这可能是问题吗?

可能有以下几点:

<a href="#" data-bind="click:function() { $root.addFilter($data) }">

会有帮助吗?

答案 1 :(得分:3)

我碰到了类似的东西,起初我跑了data-bind="click:function() { console.log($parents) }"。请注意,其$parents不是$parent。我寻找上下文,我需要的那个看起来像data-bind="click:$parents[1].onCardClick"

答案 2 :(得分:0)

我在 ko 上下文中找到并尝试使用如下示例。 $parentContext.$parent.onButtonClick