【问题标题】:EmberJS - Prevent record with duplicate attributes being added to storeEmberJS - 防止将具有重复属性的记录添加到存储中
【发布时间】:2014-10-16 19:59:12
【问题描述】:

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

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

    }

我有几个警报 - 一个在我检查值之前显示数组控制器的长度,然后在商店中创建记录,然后一个。所以我用 3 条记录运行它,比如“tom”、“dick”、“harry”,如果我在其中添加“fred”,第一个警报是 3,第二个警报也是 3,然后出现 fred。

我对为什么第二个警报显示 3 而不是 4 感到困惑 - 我假设(可能不正确)arrayController 尚未使用新记录进行更新。

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

提前感谢您的任何建议。

乔恩

【问题讨论】:

    标签: javascript arrays ember.js store


    【解决方案1】:

    从您编写代码的方式来看,您使用 'ArrayController, I'm going to assume that the model for this particular route is all of your keywords. So themodel` 挂钩可能是:

    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 处理。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2016-07-10
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多