& # 39;这个# 39;ES6和Knockout的作用域
'this' scope with ES6 and Knockout
我在使用ES6时遇到了'this'作用域的问题。
这是我用BabelJS编译的原始代码的链接。
当调用函数从数组中移除一个元素时,'this'的作用域是未定义的。
如何在不重新定义这个的情况下使这个变成这个(let self = this)?
"use strict";
var _createClass = (function() {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
})();
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Point = (function() {
function Point() {
var _this = this;
_classCallCheck(this, Point);
this.myArray = ko.observableArray([1, 2, 3, 4]);
this.removeFromArrayWithArrowFunction = function(value) {
_this.myArray.remove(value);
};
}
_createClass(Point, [{
key: "removeFromArray",
value: function removeFromArray(value) {
this.myArray.remove(value);
}
}]);
return Point;
})();
ko.applyBindings(new Point());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span data-bind="text: ko.toJSON(myArray)"></span>
<h2>Issues with this scoping when using a regular Function</h2>
<ul data-bind="foreach: myArray">
<li>
<a href="#" data-bind="text: $data, click: $parent.removeFromArray"></a>
</li>
</ul>
<h2>Works as expected using an arrow function</h2>
<ul data-bind="foreach: myArray">
<li>
<a href="#" data-bind="text: $data, click: $parent.removeFromArrayWithArrowFunction"></a>
</li>
</ul>
如果在绑定中直接使用视图模型函数,就会失去this
的上下文,就像Jeff Mercado解释的那样。箭头函数捕获封闭上下文的this
值,因此如果您使用箭头函数表示法,则不必担心var self = this
。
那么修改如下:
removeFromArray(value) {
this.myArray.remove(value);
}
为:
removeFromArray = (value) => {
this.myArray.remove(value);
}
应该没问题。
看到巴别塔
相关文章:
- 监视函数从服务返回不起作用,但作用域函数起作用
- 将作用域存储在JSON中
- 从控制器继承了隔离的作用域以生成可重用的指令
- 从ng模板访问作用域
- 调用私有作用域
- 对父作用域的指令更新延迟了一步
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- 在具有命名作用域的自定义Polymer元素中隐藏表行
- AngularJS指令隔离作用域
- Angularjs:修改js中的作用域,稍后在页面中使用
- 访问多个指令的隔离作用域
- Javascript作用域和Ajax调用;工作不正常
- 向Angular作用域对象添加对象数组——TypeError
- ng重复中的ng模型-初始化唯一作用域属性
- 在put方法之前从作用域获取数据
- 如何在html中以角度显示自定义指令的作用域
- Knockout$root和$parent中Javascript变量的作用域
- & # 39;这个# 39;ES6和Knockout的作用域