Cha*_*ore 5 javascript ember.js
在我正在构建的Ember应用程序中,我有一个ArrayController管理一个项目列表,其中包含数组中每个记录对象的几列数据,并在视图的每个列标题中都有一个排序按钮.我已经设置了名单每巴林特ERDI推荐的方法给定列排序这里.您将在下面的代码中看到这种排序.
分拣工作正常.但是,当我从数组中删除项目时出现问题.目前,当我尝试从数组中删除项目时,显然从数组中删除了正确的项目并从存储中正确删除,并将删除保存到我的后端.但是,删除项目后,我的视图不正确.在某些情况下,错误的项目显示为已删除,在其他情况下,没有项目显示为已删除.然而,如果我再次按排序,视图会正确更新.
所以,数组的索引显然是如何下降的,但是我不确定我的所有尝试应用其他人的技巧是不行的!
这是我的路线对象:
App.UsersFilesRoute = Ember.Route.extend({
model: function () {
return this.modelFor('users').get('files');
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的ArrayController:
App.UsersFilesController = Ember.ArrayController.extend({
sortProperties: ['name'],
sortedFiles: Ember.computed.sort('model', 'sortProperties'),
actions: {
addFile: function(file) {
var newFile = this.store.createRecord('file', {
name: file.name.trim(),
fileSize: file.size,
loaded: false
});
this.pushObject(newFile);
},
sortBy: function (sortProperties) {
this.set('sortProperties', [sortProperties]);
},
removeFile: function (fileToRemove) {
var _this = this;
var file = this.store.find('file', fileToRemove.get('id'));
file.then( function (file) {
_this.removeObject(file);
file.deleteRecord();
file.save();
});
},
saveFile: function (file) {
....
}
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的模板代码:
<div class="hidden-xs row user-file-header-row">
<div class="col-sm-5 col-md-5 user-file-header">
File Name
<button type="button" class="btn-xs btn-default files-sort-btn" {{ action 'sortBy' 'name'}}></button>
</div>
<div class="col-sm-1 col-md-1 user-file-header">
Size
<button type="button" class="btn-xs btn-default files-sort-btn" {{ action 'sortBy' 'fileSize'}}></button>
</div>
</div>
{{#each file in sortedFiles}}
<div class="row user-file user-file-break">
<div class="col-xs-11 col-sm-5 col-md-5 user-file-name">
<a {{ bind-attr href="file.path" }} >{{ file.name }} </a>
</div>
<div class="col-xs-9 col-sm-1 col-md-1">
{{ format-file-size file.fileSize }}
</div>
<div class="col-xs-9 col-sm-1 col-md-1">
<button type="button" class="btn-xs btn-default files-list-btn" {{ action 'removeFile' file }}></button>
</div>
</div>
{{/each}}
Run Code Online (Sandbox Code Playgroud)
注意:我的问题和其他StackOverflow问题之间有一些相似之处:使用jQuery UI对Ember.js项进行排序后,使用Ember Data的model.deleteRecord()不起作用,但是,我试图应用该答案我自己的问题没有成功.此外,我的排序中没有jQuery.
好的。我找到了答案,或者更确切地说,答案找到了我。
我的问题是,在上面的代码中,我从 ArrayController 中删除该项目,然后调用 .delete() 和 .save()。这一系列的调用向 Ember 发送了关于如何更新我的视图的相互冲突的信号。显然, .removeObject() 实际上是从数组中删除该项目,但随后的 .delete()/.save() 将视图后面的模型设置为删除之前的状态(对此不确定,但这就是我看到发生了)。
所以无论如何, .destroyRecord() 返回一个承诺,所以我将 .removeObject() 移动到 .then() 中以实现承诺,这解决了问题。
因此,removeFile 操作中的以下代码解决了该问题:
removeFile: function () {
var self = this;
var fileToRemove = this.get('fileToRemove');
var file = this.store.find('file', fileToRemove.get('id'));
file.then (function (file) {
file.destroyRecord().then(function(){
self.get('model').removeObject(file);
});
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,您不必首先执行 this.store.find(),您可以简单地执行以下操作:
removeFile: function () {
var self = this;
var fileToRemove = this.get('fileToRemove');
fileToRemove .destroyRecord().then(function(){
self.get('model').removeObject(file);
});
}
Run Code Online (Sandbox Code Playgroud)
然而,我选择保守并仔细检查商店。这对我来说似乎更安全。