2017-07-06 18 views
0

我知道这很容易理清,而且可能的答案只是在我的鼻子下面,但是:我试图创建一个自定义绑定来编辑HTML5的内容this link示例,我无法让它与observableArray()一起使用。淘汰内容与数组值的绑定

表正在显示在用foreach数据bindig视图这样的:

 <tbody data-bind="foreach: customers"> 
      <tr data-bind="attr: {id: $index}"> 
       <td style="text-align: center;"> 
        <span class="label label-primary" data-bind="html: Id"></span> 
       </td> 
       <td data-bind="html: Name, attr: {id: 'Nome'}, contentEditable: true"></td> 
      </tr> 
     </tbody> 

视图模型是这样的:

功能视图模型(){

 var self = this; 

     self.data = '@jsonList'; 
     self.customers = ko.observableArray(JSON.parse(self.data)); 
     self.editable = ko.observable(false); 

     for (i = 0; i < self.customers().length; i++) { 

      self.customers()[i]['Details'] = '/Anagrafica/Details/' + self.customers()[i]['Id']; 

      self.customers()[i]['Delete'] = '/Anagrafica/Delete/' + self.customers()[i]['Id']; 

     }; 

     ko.bindingHandlers.htmlEdit= { 

      update: function (element, valueAccessor) { 
       var value = ko.unwrap(valueAccessor()); 
      } 
     }; 

     ko.bindingHandlers.contentEditable = { 

      init: function (element, valueAccessor, allBindingsAccessor) { 
       var value = ko.unwrap(valueAccessor()), 
        htmlEdit= allBindingsAccessor().htmlEdit; 

       $(element).on("input", function() { 
        if (ko.isWriteableObservable(htmlEdit)) { 
         htmlEdit(this.innerHTML); 
        } 
       }); 
      }, 

      update: function (element, valueAccessor) { 
       var value = ko.unwrap(valueAccessor()); 
       element.contentEditable = value; 
       $(element).trigger("input"); 
      } 

     }; 
    }; 


    var viewModel = new ViewModel(); 

    ko.applyBindings(viewModel); 

在我对代码本身有点困惑,因为我不明白如何将它设置为指向数组上的元素。

注意:该数组已填充,我没有显示内容的问题。

谢谢我提前寻求帮助。

编辑:在这里我想补充的jsfiddle https://jsfiddle.net/wxn34p45/的代码

回答

0

更好的读看起来像你有一个拼写错误名称,而不是名称:

<td data-bind="html: name, attr: {id: 'Nome'}, contentEditable: true"></td> 

而且客户是不是observableArray(以你的小提琴至少):

self.customers = ko.observableArray([{"Id":1111,"name":" [Malena]"},{"Id":2222,"name":" [Maria]"},{"Id":3333,"name":" [Merio]"},{"Id":4444,"name":" [Milena]"}]); 

我已经更新了小提琴(也得到了它的淘汰赛跑,我也显示视图模型的副本以帮助调试),内容现在是可编辑的。

<h4>View Model</h4> 
    <pre data-bind="text: ko.toJSON($data, null, 2)"></pre> 

这是现在给予预期的效果吗?

https://jsfiddle.net/asindlemouat/wxn34p45/1/

编辑

随着提供我已成功地使这个可编辑的详细信息,我已删除了客户阵列可编辑和使用的一个在视图模型。

由于它循环遍历客户数组,因此您需要使用$ parent.editable调用ViewModel中的可编辑观察值。

<tbody data-bind="foreach: customers"> 
    <tr data-bind="attr: {id: $index}"> 
    <td style="text-align: center;"> 
     <span class="label label-primary" data-bind="html: Id"></span> 
    </td> 
    <td data-bind="html: name, attr: {id: 'Nome'}, contentEditable: $parent.editable"></td> 
    <td></td> 
    </tr> 
</tbody> 

更新小提琴:https://jsfiddle.net/asindlemouat/wxn34p45/8/

+0

感谢您intrest和我的小提琴编辑(我在使用它可怕),但没有:它仍然没有得到修改。最后的目标是用Ajax调用来改变原始模型^^“但我已经知道如何调用 – Blacky

+0

我的意思是,内容应该可以用”contentEditable:editable“进行编辑,这样自定义处理程序将会改变在可观察数组中的参数 – Blacky

+0

好的,什么触发了可编辑和不可编辑之间的变化?从您提供给其他SO帖子的链接中接受的答案的例子中,他们使用复选框来更改“self”的值。 editable'。 – ASindleMouat