2012-04-14 75 views
0

我创建的使用淘汰赛结合的链接列表的字符串:Knockout.js我该如何建立有约束力的

的Javascript和视图模型看起来是这样的:

$(function() { 
    var adminViewModel = function() 
    { 
     var self = this; 
     self.leftItems = ko.observable([ { Name: "Item1", Id: 0 }]); 
     self.getChildren = function (id, list) { 
      var url ="@Url.Content("~/api/Test/GetChildren/")" + id; 
      $.getJSON(url, function (data) { 
       list(data); 
      }); 
     }; 
    } 
    var Admin3App = window.Admin3App = window.Admin3App || {}; 

    Admin3App.viewModel = new adminViewModel(); 
    ko.applyBindings(Admin3App.viewModel); 

    function getLeftChildren(id) 
    { 
     Admin3App.viewModel.getChildren(id, Admin3App.viewModel.leftItems); 
    } 
    getLeftChildren(0); 

} 

(EDIT :ko.observable的init缺少一个Id(尽管这不会导致错误,但添加了它)

这是如何工作的,视图模型将加载一堆没有父项(ID为0)的项目 为了简单起见,我只包含了左边的版本,但是该页面的左侧和右侧有一个项目列表,因此每个项目都有一个功能。

左边的项目被填充以查看模型左边的项目并显示如下。但每个项目都是一个链接,一旦通过javascript点击将刷新基于父Id的项目。 (就像在浏览器中浏览文件夹查看器一样)。

但我无法弄清楚如何在knockout中声明绑定来建立url。我知道这可能很容易,我只是想念它。

下面是HTML我试图在其他之中

<div class="leftView"> 
    <div data-bind="foreach: leftItems"> 
     <a data-bind="text: Name, attr : { href:'javascript:getLeftChildren(' + Id + ')' }"></a><br /> 
    </div> 
</div> 

(编辑:错过了一个单引号,但得到了同样的错误反正) 但我不断收到一个绑定错误

+0

我建议重构你的代码:添加“getLeftChildren”向视图模型(因为它提供了相关的视图功能,它属于那里),并使用“点击”绑定。 – Niko 2012-04-14 10:10:53

+0

你的ID来自哪里(用于数据绑定表达式)? – Hans 2012-04-14 12:07:30

+0

对于我添加的对象,它缺少Id,但我的运行代码没有在数组的初始化中的任何项目,但我从Json返回的对象有Id,即时更正问题 – Andre 2012-04-14 12:36:29

回答

2

一对夫妇的事情:

1)leftItems应该理想地是observableArray

2)初始对象,你推入leftItems做没有Id属性

这里是一个JSfiddle,它纠正了一些事情,并演示加载一组初始数据,然后再次调用以加载不同的数据。我还在viewModel中移动了外部JavaScript调用,并切换到使用点击处理程序来传递刷新数据(请注意,点击绑定会自动将数据项作为第一个参数发送到事件处理程序中,因此您可以访问您需要创建您的网址的ID)。

http://jsfiddle.net/jearles/xTHFg/

+0

Point 1)正确的,我错过了它的例子(这不是错误的原因,虽然)我纠正了我的问题,并添加它。我的绑定是错误的时期,我认为这样的事情只是把它放在viewModel,作为一个函数或ko.computed或东西,然后直接绑定像这样的attr:{href:refreshUrl}。但使用点击更优雅,您的示例工作,现在我的工作也很完美,谢谢 – Andre 2012-04-14 12:41:06