EmberJS - 防止将重复属性添加到商店的记录

时间:2014-10-16 09:08:52

标签: javascript arrays ember.js store

我在这里的第一个问题所以如果以前曾经问过这个问题并且/或者我犯了一些新手错误,请接受我的道歉!

我试图通过一个简单的练习来绕过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被拒绝,因为它是重复的。

提前感谢任何建议。

乔恩

1 个答案:

答案 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将负责其余部分。