2013-07-17 78 views
2

我是knockout.js的新手,并通过其网页上的示例进行了工作。我的工作的一个相关示例是Ajax todo list,其中列表的条目在浏览器和服务器之间来回发送。预填充的observableArray在淘汰赛中

我正在尝试构建一个包含评论列表的网站。

<ul data-bind="foreach: comments, visible: comments().length > 0"> 
    <li> 
     <input data-bind="value: title, disable: isDone" /> 
     <a href="#" data-bind="click: $parent.removeComment">Delete</a> 
    </li> 
</ul> 

我可以使用observableArray对象,并且在加载站点时使用knockout创建整个ul​​-list。不过,我也希望网站能够在没有javascript和ajax的情况下工作(这样搜索引擎可以为它编制索引,而没有javascript的用户可以使用它)。 因此,如果站点可以从服务器加载一些已经存在的评论为html,那将会更好。但我希望knockout.js以与新添加的方式相同的方式处理现有注释,即我希望所有li元素都成为comments-observableArray的一部分,即使是从服务器加载为html的元素。这可能吗?如何?

回答

1

不,你不能'混合'淘汰数据源和HTML。 但是你可以显示你的html,然后用knockout来显示动态评论。

您可以将新项目添加到Ajax回调函数中的observableArray注释中。

初始化绑定

var vm = { 
    comments : ko.observableArray([...]) 
}; 
ko.applyBindings(vm); 

服务器回调函数

var ajaxCallback = function(items){ 
    ko.utils.arrayForEach(items, function(item){ 
     vm.comments.push(item); 
    });  
} 

可能是你可以生成初始化客户端上的评论阵列的服务器上的脚本。

我希望它有帮助。

+1

这是一个遗憾,但你的回答给了我另一个想法:我可以预先填充html中的列表,并另外发送所有必要的数据淘汰赛。如果javascript可用,我可以从列表中删除所有以前的项目并使用observableArray数据。 –

0

为了解决这个问题,我使用JSON预先填充了我的observables,并将相同的JSON传递给服务器端进行渲染。生成的HTML看起来像这样:

<input data-bind="value: title" value="{{title}}" /> 

我用的NodeJS /车把,但是这可能与任意数量的服务器端/模板组合来完成。例如。 PHP/Smarty。