给定一个数组sourceArray
,我想创建一个依赖于第一个数组条目的targetArray
。这意味着创建的数组应该包含每个源条目的条目,并在sourceArray
更改时进行更新。然而,修改targetArray
永远不应该更新源代码。
只要sourceArray
是静态的,这种Plunker就可以工作。一旦你开始修改source-entries,它显然不会正确地更新目标,因为我缺乏一个合适的数据绑定机制。
我需要通过观察sourceArray
来手动更新targetArray
吗?还是有一种由Angular实现的单向数据绑定机制,我可以使用它来保持两个数组的同步?
发布于 2016-12-16 17:46:26
就像普里塔姆说的。您应该使用$watch。但必须将Collection绑定到它,才能使其工作。在手表内部合并数组。
查找此工作示例:
$scope.$watchCollection(angular.bind(this, function () {
return this.sourceArray;}), function (newVal, oldVal) {
var arr = [];
for(var i in vm.sourceArray){
var shared = false;
for (var j in vm.targetArray)
if (vm.targetArray[j].id == vm.sourceArray[i].id) {
shared = true;
break;
}
if(!shared) arr.push(vm.sourceArray[i])
}
console.log(arr);
vm.targetArray = vm.targetArray.concat(arr);
},true);
发布于 2016-12-13 08:53:55
您应该使用$watch
。然后添加必要的函数。
您可以查看here和official documentation.
$watch( watchExpression,listener,objectEquality);注册一个侦听器回调,以便在watchExpression发生更改时执行。
每次调用$digest()时都会调用watchExpression,它应该返回要监视的值。(在使用相同的输入多次执行时,watchExpression不应更改其值,因为$digest()可能会多次执行它。也就是说,watchExpression应该是幂等的。)仅当当前watchExpression的值与前一次watchExpression调用的值不相等时,才会调用侦听器(初始运行除外,见下文)。不等式是根据引用不等式确定的,通过!== Javascript运算符进行严格比较,除非objectEquality ==为true (见下一点)当objectEquality ==为true时,watchExpression的不等式根据angular.equals函数确定。为了保存对象的值以便以后进行比较,可以使用angular.copy函数。因此,这意味着观察复杂的对象将具有不利的内存和性能影响。由于angular.copy的限制,不应使用此选项来监视属于或包含文件对象的对象中的更改。监视侦听器可能会更改模型,这可能会触发其他侦听器触发。这是通过重新运行观察器直到没有检测到任何更改来实现的。重新运行迭代限制为10,以防止无限循环死锁。如果希望在调用$digest时收到通知,可以注册一个不带侦听器的watchExpression函数。(准备好对watchExpression的多个调用,因为如果检测到更改,它将在单个$digest周期中执行多次。)
在将监视器注册到作用域之后,将异步调用侦听器fn (通过$evalAsync)来初始化监视器。在极少数情况下,这是不可取的,因为侦听器是在watchExpression的结果没有改变时调用的。要在监听器fn中检测这种情况,可以比较newVal和oldVal。如果这两个值相同(===),则由于初始化而调用侦听器。
发布于 2016-12-17 07:25:19
您可以使用$watch表达式。
这是另一种方式:-(下载underscore.js或CDN)
http://plnkr.co/edit/hrOrEdaQ0M7wEgWlRHlO?p=preview
method.
});
你可以获得underscore.js代码:-
_.extend = createAssigner(_.allKeys);
// An internal function for creating assigner functions.
var createAssigner = function(keysFunc, undefinedOnly) {
return function(obj) {
var length = arguments.length;
if (length < 2 || obj == null) return obj;
for (var index = 1; index < length; index++) {
var source = arguments[index],
keys = keysFunc(source),
l = keys.length;
for (var i = 0; i < l; i++) {
var key = keys[i];
if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
}
}
return obj;
};
};
// Retrieve all the property names of an object.
_.allKeys = function(obj) {
if (!_.isObject(obj)) return [];
var keys = [];
for (var key in obj) keys.push(key);
// Ahem, IE < 9.
if (hasEnumBug) collectNonEnumProps(obj, keys);
return keys;
};
// Extend a given object with all the properties in passed-in object(s).
https://stackoverflow.com/questions/41116766
复制相似问题