2012-10-24 29 views
0

编辑:回答我自己,错误是因为旧版本的淘汰赛,总是使用最新版本,并检查存在!淘汰赛给出无法解析在foreach循环中的绑定属性

我一直在使用knockout教程,并试图自己做一些事情,但是得到错误,即使我基本上有相同的代码。

<ul data-bind="foreach: tasks"> 
<li> 
    <input data-bind="value: title" /> 
</li> 
</ul> 

    <script type="text/javascript"> 
     (function() { 
      function Task(data) { 
       this.title = ko.observable(data.contentName); 
      } 

      function TaskListViewModel() { 
       // Data 
       var self = this; 
       self.tasks = ko.observableArray([]); 

       // Load initial state from server, convert it to Task instances, then populate self.tasks 
       $.getJSON('<%= Url.Action("GetContentList", "TranslateContentMenu") %>', 
        { 
         languageId: $('#LanguageIdNameValuePairs').val() 
        }, function (allData) { 
        var mappedTasks = $.map(allData, function (item) { return new Task(item) }); 
        self.tasks(mappedTasks); 
       }); 
      } 

      var test = new TaskListViewModel(); 
      console.log(test); 
      ko.applyBindings(new TaskListViewModel()); 
     }()) 
</script> 

我打电话的服务,返回以下结果: [{ “内容识别”: “1b07790c”, “内容名”: “测试”},{ “内容识别”: “1b07790c”, “内容名”: “test”},{“contentId”:“1b07790c”,“contentName”:“test”}]

并且这是错误,直接从萤幕控制台输出: 错误:无法解析绑定属性。 消息:ReferenceError:标题未定义; 属性值:标题

+3

您的代码适用于我:http://jsfiddle.net/vyshniakov/wKEn4/。我认为你没有发布的HTML标记有问题。你在什么绑定中遇到错误? –

+0

我忘记了代码块中的ul标签,因此它不包含在内。我附加了错误信息,出于某种原因,它似乎不理解标题是一个Task对象,并且在ajax请求得到响应之前它失败了...... – ruffen

+1

只是修复了错误,它是由于到老淘汰赛版本....注意自我:先检查版本! 非常感谢您的时间和帮助! – ruffen

回答

0

正如@Artem在评论中指出的那样,他在他构建的jsFiddle中工作。我唯一可以放下的是你格式不对的HTML。你写道:

<ul data-bind="foreach: tasks"> 
<li> 
    <input data-bind="value: title" /> 
</li> 

淘汰赛不喜欢格式不对的HTML。你应该尝试:

<ul data-bind="foreach: tasks"> 
<li> 
    <input data-bind="value: title" /> 
</li> 
</ul> 
+0

缺少的ul是因为我忘记将它包含在代码块中,不幸的是这不是问题。但它是更大系统的一部分,所以故障可能在其他地方。 – ruffen

+0

正如你所看到的,错误是由于旧版本的淘汰赛,所以,我的坏! 非常感谢您的时间和帮助! – ruffen

1

你不应该得到这样的错误,因为在这个时候tasks阵列应该是空的,并剔除不应该产生<li>标签。确保你正在初始化tasks数组[]nothing而不是像这样[""]

你也可以尝试用空Task对象初始化任务:

self.tasks = ko.observableArray(new Task()); 
+0

也做到了这一点,我试过几乎所有的东西,除了检查版本号.... 非常感谢您的时间和帮助! – ruffen

1

我得到的错误是因为我用的淘汰赛1.2.1,最新版本为今天的是2.1.0,升级做淘汰赛这行得通。