Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 找出在Ember ArrayController中更改的单个项目_Javascript_Ember.js_Observers - Fatal编程技术网

Javascript 找出在Ember ArrayController中更改的单个项目

Javascript 找出在Ember ArrayController中更改的单个项目,javascript,ember.js,observers,Javascript,Ember.js,Observers,在Ember.ArrayController中,我有一个函数.observes() 用于属性更改的整个模型数组上的属性 var FoosController = Ember.ArrayController.extend(Ember.Evented, { observesEachFooBar: function() { var foos = this.get('model'); foos.forEach(function(foo) {

Ember.ArrayController
中,我有一个函数
.observes()
用于属性更改的整个模型数组上的属性

var FoosController = Ember.ArrayController.extend(Ember.Evented, {

    observesEachFooBar: function() {
        var foos = this.get('model');
        foos.forEach(function(foo) {
            //test if this foo has changed, then do something
        });
    }.observes('model.@each.bar'),

});
在这里,我手动测试其模型中的每一个
Foo
。 我怎样才能避免这样做,而只得到一个(或几个)
这已经改变了吗?

余烬使用SortableMixin来实现这一点。你可以遵循同样的模式

forEach(sortProperties,function(sortProperty){
addObserver(item,sortProperty,this'contentItemSortPropertyDidChange');
},这个);
},这个);
}
返回此。_super(数组、idx、removedCount、AdddCount);
},
insertItemSorted:函数(项){
var arrangedContent=get(这是“arrangedContent”);
var length=get(arrangedContent,'length');
var idx=this.\u二进制搜索(项,0,长度);
安排内容插入(idx,项目);
},
contentItemSortPropertyDidChange:函数(项){
var arrangedContent=get(这是“arrangedContent”),
oldIndex=已安排的内容索引(项目),
leftItem=arrangedContent.objectAt(旧索引-1),
rightItem=arrangedContent.objectAt(旧索引+1),
leftResult=leftItem&&this.orderBy(item,leftItem),
rightResult=rightItem&&this.orderBy(item,rightItem);
如果(leftResult<0 | | rightResult>0){
排列内容。移除对象(项);
此.insertItemSorted(项);
}
},
使用
addArrayObserver
方法以及
ArrayContentChange
arrayContentDidChange

App.IndexController = Em.ArrayController.extend({
  initializer: function() {
    this.addArrayObserver({
      arrayWillChange: Em.K,
      arrayDidChange: function(observedObj, start, removeCount, addCount) {
        if(!removeCount && !addCount) {
          alert('Array item at ' +start+ ' updated');
        }
      }
    });
  }.on('init'),

  actions: {
    updateData: function() {
      this.get('content').arrayContentWillChange(3, 0, 0);
      this.set('content.3.foo', 'foo3-updated');
      this.get('content').arrayContentDidChange(3, 0, 0);
    }
  }
});

可能是@SteveH的副本。这并不完全适用-不同之处在于数组观察器寻找对数组本身的更改(元素的添加和删除)。然而,我要求的是观察数组元素的属性。@SteveH。换句话说,您链接的问题可能是
.observes('model.@each')
的解决方案,但不是
.observes('model.@each.bar')
用例的解决方案?观察每个可能的属性通常是个坏主意,原因很明显。我应该说,在大型集合上观察所有可能的属性可能是个坏主意。可能适合小规模收藏。:)本质上是OP试图避免的,但是,嘿,阅读源代码的好教训+1@kingpin2k是的,这只是将观察者分别添加到数组中的每个项目。它会起作用,但我希望有一种方法可以使用声明性语法来实现这一点,类似于
.observes('model.@each.propertyName')
。是的,这是唯一可以实现这一点的可用模式。从好的方面来说,如果性能确实是一个问题,那么这将是一种方法,在设置观察者时循环一次,然后在更改时,将确切的项发送到回调,而不是每次项更改时都循环。因此,您需要提前支付费用,以便以后进行更便宜的呼叫。我认为在此处设置阵列观察器没有任何用处,您是在手动触发事件。您不妨创建两个方法,并在任何时候更改数据时调用它们。@kingpin2k我明白您的意思。这只是另一种解决办法。OP不想检查每个项目来检查哪个项目发生了变化。也就是说,我需要研究这些
ArrayContentChange
arrayContentDidChange
的真正用途。
App.IndexController = Em.ArrayController.extend({
  initializer: function() {
    this.addArrayObserver({
      arrayWillChange: Em.K,
      arrayDidChange: function(observedObj, start, removeCount, addCount) {
        if(!removeCount && !addCount) {
          alert('Array item at ' +start+ ' updated');
        }
      }
    });
  }.on('init'),

  actions: {
    updateData: function() {
      this.get('content').arrayContentWillChange(3, 0, 0);
      this.set('content.3.foo', 'foo3-updated');
      this.get('content').arrayContentDidChange(3, 0, 0);
    }
  }
});