Javascript 创建后的敲除绑定

Javascript 创建后的敲除绑定,javascript,knockout.js,Javascript,Knockout.js,简单地说: <div data-bind="with: viewModel"> <h1 data-bind="text: someproperty"></h1> <button data-bind="click: createNewButton">Create new Button</button> <div data-bind="foreach: buttons"> <di

简单地说:

<div data-bind="with: viewModel">
    <h1 data-bind="text: someproperty"></h1>

    <button data-bind="click: createNewButton">Create new Button</button>

    <div data-bind="foreach: buttons">
        <div data-bind="html: button"></div>
    </div>
</div>

创建新按钮
JavaScript:

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

    self.someproperty = ko.observable("hi");

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

    self.createNewButton = function () {
        self.buttons.push("<button data-bind='click: doThis'></button>");
    }

    self.doThis = function () {
        console.log(this);
    }
}

ko.applyBindings({viewModel: new viewModel()});
var viewModel=函数(){
var self=这个;
self.someproperty=ko.可观察(“hi”);
self.buttons=ko.observearray([]);
self.createNewButton=函数(){
self.按钮。按(“”);
}
self.doThis=函数(){
console.log(this);
}
}
applyBindings({viewModel:newviewmodel()});

因此,一旦按钮被添加到observable中并且视图被更新,我就想重新应用绑定。这可能吗?

您最好使用模板来解决此问题,如下所示:

<script type="text/html" id="btnTemplate'>
    <button data-bind='click: $root.doThis'></button>
</script>

<div data-bind="with: viewModel">
    <h1 data-bind="text: someproperty"></h1>

    <button data-bind="click: createNewButton">Create new Button</button>

    <div data-bind="template: { name: 'btnTemplate', foreach: buttons }">
    </div>
</div>

您设置了for each a button属性,但我在模型中没有看到该属性。你能更具体地说你想完成什么吗?没关系,有人回答了我想看到的,这很聪明!!因此,使用模板时,我不需要任何额外的库,如tmpl?那么,当前上下文是否会传递给单击,因此,如果这是在一个表中,并且您希望将当前项(
$data
)发送给单击进行处理,这可能吗?@No1_Melman不,您不需要任何额外的库,淘汰赛天生支持模板制作。如果使用模板,而不是我第二次发布的hack,那么单击绑定事件会将上下文作为第一个参数传递。类似于:函数(datacontext,event){//access datacontext here}
<div data-bind="foreach: { data: buttons, afterRender: bindNode }">
</div>

self.bindNode = function(elements, data) {
    var element = $(elements).filter('div');
    ko.applyBindingAccessorsToNode(element[0], 
       { 
           click: function() { return self.someAction } //Needs to be wrapped in a function call
       } );
}