EmberJS-防止将具有重复属性的记录添加到存储中

EmberJS - Prevent record with duplicate attributes being added to store

本文关键字:记录 添加 存储 属性 EmberJS-      更新时间:2023-09-26

我在这里的第一个问题,所以如果以前有人问过这个问题和/或我犯了一些新手错误,请接受我的歉意!

我正试图通过一个简单的练习来了解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', '');
    }

我在那里有几个警报——一个是在我检查值并随后在商店上创建Record之前显示阵列控制器的长度,另一个是之后。所以我用3条记录运行这个,说"tom"、"dick"、"harry",如果我把"fred"加进去,第一个警报是3,第二个警报也是3,fred出现了。

我很困惑为什么第二个警报显示的是3而不是4——我假设(也许是错误的)arrayController尚未用新记录更新。

其次,如果我重新启动,然后尝试添加fred,dick作为输入,两者都被添加,我会认为fred应该被添加,dick被拒绝,因为这是重复的。

提前感谢您的任何建议。

Jon

根据您编写代码的方式和使用"ArrayController , I'm going to assume that the model for this particular route is all of your keywords. So the模型"的方式判断,钩子可能是:

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值覆盖EmberData属性。(至少我记得它是这样工作的。我可能错了,但没关系。)isNew是Ember Data创建的一个计算属性,当对象的状态发生变化时,它会自动更新。不用担心手动设置;只需像往常一样使用该记录,Ember Data将负责其余部分。