为什么此绑定的剔除元素变得不确定?

时间:2018-08-15 12:08:40

标签: javascript typescript knockout.js knockout-2.0

使用TypeScript和Knockout构建页面。页面加载时,视图模型将创建一个值并将其分配给对象的“车辆”数组。

vehicles: KnockoutObservableArray<Vehicle>;

constructor() {
    // uses and API to fetch data into a "vehicleData" array
    this.vehicles = ko.observableArray(vehicleData);
}

并且在页面本身中,该元素绑定到包含“删除”按钮的元素:

<div data-bind="foreach: vehicles">
    <div data-bind="text: model"></div>
    <button data-bind="click: $parent.removeVehicle">Remove</button>
</div>

这很好。我不明白的是在调用removeVehicles时会发生什么。在这里:

removeVehicle(vehicle): void {
    this.vehicles.remove(vehicle);
}

它按预期传递了参数,但是当它尝试删除时,它声称“车辆”不再存在。

Uncaught TypeError: Cannot read property 'remove' of undefined
    at Object.VehicleManagementViewModel.removeVehicle
    at HTMLButtonElement.<anonymous> (knockout-latest.js:99)

是什么导致数组变得不确定?当HTML元素正确绑定到它时,如何才能取消定义它呢?

2 个答案:

答案 0 :(得分:1)

我手边没有敲除/打字稿设置来尝试这种方法,但是我会猜测说“ this”在函数中已经失去了对父类的引用。

如果您在剔除主页上查看示例,您会发现他们使用“自我”变量来存储“此”引用。也许模板没有使用正确的“ this”值调用函数。使用console.log查看“这个”值是什么。

<ul data-bind="foreach: places">
    <li>
        <span data-bind="text: $data"></span>
        <button data-bind="click: $parent.removePlace">Remove</button>
    </li>
</ul>

 <script type="text/javascript">
     function MyViewModel() {
         var self = this;
         self.places = ko.observableArray(['London', 'Paris', 'Tokyo']);

         // The current item will be passed as the first parameter, so we know which place to remove
         self.removePlace = function(place) {
             self.places.remove(place)
         }
     }
     ko.applyBindings(new MyViewModel());
</script>

答案 1 :(得分:1)

如果您以这种方式在视图模型中引用一个函数,则this将被Knockout覆盖。

您可以在视图模型中将功能定义为箭头功能。这样,this将继续引用视图模型类。

因此您可以更改:

removeVehicle(vehicle): void {
    this.vehicles.remove(vehicle);
}

收件人:

removeVehicle = (vehicle) => {
    this.vehicles.remove(vehicle);
}