创建一个循环遍历源对象的自定义指令,并在指令的范围内创建相应的属性,这些属性是对源对象的 getter/setter 引用。
看看这个plunker。
指令模块:
angular.module('koWith', [])
.directive('koWith', function () {
return {
controller: function ($scope, $attrs) {
var withObj = $scope.$parent[$attrs.ngWith];
function getter(prop) {
return this[prop];
}
function setter(val, prop) {
this[prop] = val;
}
for (var prop in withObj) {
if (withObj.hasOwnProperty(prop)) {
Object.defineProperty($scope, prop, {
enumerable: true,
configurable: true,
get: getter.bind(withObj, prop),
set: setter.bind(withObj, prop)
});
}
}
},
restrict: 'A',
scope: true
};
});
应用模块:
angular.module('myApp', [])
.controller('myController', function ($scope) {
$scope.customer = {
name: "Timmeh",
address: {
address1: "12 S Street",
address2: "",
city: "South Park",
state: "CO",
zipCode: "80440"
}
};
});
html:
<div ko-with="customer">
<h2>{{name}}</h2>
<div ko-with="address">
{{address1}}<br>
{{address2}}<br>
{{city}}, {{state}} {{zipCode}}
</div>
</div>
解释
在 KnockoutJS 中,绑定将 bindingContext 和数据分开,因此创建with
绑定很简单,因为它只需要从当前绑定创建一个新的子 bindingContext 并将with
对象用作其数据值。
在 AngularJS 中,指令的作用域基本上是 bindingContext 和数据对象合二为一。创建新范围时,为了获得类似的with
行为,with
必须将对象的属性引用到新创建的范围对象上。