我在这里的第一个问题所以如果以前曾经问过这个问题并且/或者我犯了一些新手错误,请接受我的道歉!
我试图通过一个简单的练习来绕过EmberJS。我正在尝试创建一个关键字列表,我有基本的功能。我希望允许用户在商店中输入以逗号分隔的关键字列表,但是,如果关键字是重复的,请提醒。
所以我有一个带有Actions对象的ArrayController,我在其中有一个createKeyword函数。
createKeyword: function() {
// Get the keyword title set by the "New Keyword" text field
var entered_value = this.get('newKeyword');
if (!entered_value) { return false; }
if (!entered_value.trim()) { return; }
var entered_values = entered_value.split(",");
for ( var i=0; i<entered_values.length; i++){
var value = entered_values[i];
value = value.replace(/\+|"|'/g," ");
if ( ! value.trim() ){
continue;
}
value = value.toUpperCase();
alert( "Prior addition:" + this.get('length'));
// Prevent duplicates being added
if ( this.findBy('keyword',value) === undefined ) {
// Create the new Keyword model
var keyword = this.store.createRecord('keyword', {
value: value,
weighting: 1,
isNew: true
});
// Save the new model
keyword.save();
alert( "post addition:" + this.get('length') );
}
else {
alert( "Keyword [" + value + "] already defined");
}
}
// Clear the "New Keyword" text field
this.set('newKeyword', '');
}
我有几个警告 - 一个是在我检查值之前显示数组控制器的长度,然后是在商店后面的createRecord和一个之后。所以我用3条记录运行它,比如'tom','dick','harry',如果我添加'fred',第一个警报是3,第二个警报也是3,fred出现。
我很困惑为什么第二个警报显示3而不是4 - 我假设(可能不正确)arrayController尚未使用新记录进行更新。
其次,如果我重新启动然后尝试添加fred,dick作为输入,两者都被添加,我会认为fred应该被添加并且dick被拒绝,因为它是重复的。
提前感谢任何建议。
乔恩
答案 0 :(得分:0)
根据您编写代码的方式判断并使用'ArrayController , I'm going to assume that the model for this particular route is all of your keywords. So the
model`钩子可能是:
model: function() {
return this.get('store').findAll('keyword');
}
假设,我想我可以回答你的问题。
首先,创建新记录时长度不会改变。它应该从3增加到4,但它不会。假设绑定还没有时间更新,你是正确的。您已将新记录添加到商店,但商店尚未有时间更新控制器的模型,因为您仍然可以控制程序流。大多数绑定在运行循环中异步更新,因此对于Ember中的许多场景,您不能指望立即更新。
其次,对于添加的重复项,很难说,但我认为这是因为你有一个逻辑错误。
// Prevent duplicates being added
if ( this.findBy('keyword',value) === undefined ) {
在我看来,好像你错误地放了keyword
而不是value
。当您输入此问题时,这可能只是一个错字,但根据您创建模型的方式,keyword
是类型,value
是属性。
最后,请注意:您不应该像创建新关键字时那样覆盖isNew
属性。这实际上将使用永久true
值覆盖Ember-Data属性。 (至少那是我记得它的工作方式。我可能错了,但没关系。)isNew
是由Ember-Data创建的计算属性,当对象状态发生变化时会自动更新。不要担心手动设置;只需像往常一样使用记录,Ember-Data将负责其余部分。