5

我有一个角工厂,他的工作是保存特殊对象并在稍后检索它们。
(用于在切换视图时保存用户工作流程)。如何将对象推入JavaScript Prototype中的数组?

基本上我需要保存具有名称的对象,以及一组标签。我的问题是将标签保存到数组部分。

原型构造:

// define the TagsObject constructor function 
var TagsObject = function(name, tag) { 
    this.name = name; 
    this.tags = [].push(tag); 
    return this; 
}; 

全面的工厂代码:

.factory('TagFactory', [function() { 

    // Init TagFactory: 
    var tagContainers = []; 

    // define the TagsObject constructor function 
    var TagsObject = function(name, tag) { 
     this.name = name; 
     this.tags = [].push(tag); 
     return this; 
    }; 

    console.log('tagFactory'); 
    console.log(TagsObject); 

    var saveTags = function(name, tag) { 

     tagContainers.push(new TagsObject(name, tag)); 

     console.log('saveTags:'); 
     console.log(tagContainers); 
    }; 

    var getTags = function(name) { 
     console.log(name); 
     return this; 
    }; 

    return { 
     saveTags : saveTags, 
     getTags : getTags 
    }; 
}]); 

在不同的控制器我现在有些数据保存到new Prototype的TagFactory内:

TagFactory.saveTags('TEST', tagObj); 

现在回到我的工厂,在那里你看到console.log(nameTagContainers);以下是日志:

[TagsObject] 
    0: TagsObject 
    tags: 1 
    name: "TEST" 
    __proto__: TagsObject 
    length: 1 
    __proto__: Array[0] 

^标签是一个数组,但它显示1,而不是对象的细节......你看到我错在哪里?



UPDATE:对此问题予以Kauê Gimenes下面回答,但是我分享我加入到解决我的问题,其他额外的代码。

这是每一个被选定为当前选择的名称的新标签时,它产生一个新的原型,而不是保存标签到现有的原型:

var saveTags = function(name, tag) { 

    console.log(tagContainers.length); 

    if (tagContainers.length != 0) { 
     for(var i = 0; i < tagContainers.length; i++) { 
      if (tagContainers[i].name == name) { 
       console.log('Found existing name! Add tag to existing obj'); 
       tagContainers[i].tags.push(tag); 
       break; 
      } else { 
       console.log('New name, create new obj'); 
       tagContainers.push(new TagsObject(name, tag)); 
      } 
     } 
    } 
    else { 
     console.log('New name, init: create the first obj'); 
     tagContainers.push(new TagsObject(name, tag)); 
    } 

    console.log(' '); 
    console.log('tagContainers:'); 
    console.log(tagContainers); 
}; 

回答

2

试试这个办法:

// define the TagsObject constructor function 
var TagsObject = function(name, tag) { 
    this.name = name; 
    this.tags = [tag]; 
    return this; 
}; 

的最佳方式初始化的阵列以包括括号内的元素

[ 1 , 2 , 3 ] 

但是如果你想用n初始化元素,你可以使用concat函数。

[ 1 ].concat([ 2 , 3 , 4 ]) 

其结果将是:

[ 1 , 2 , 3 , 4 ] 
+0

啊是啊,做工作,做回答这个问题......不过,我才意识到我写了这个代码错误。有几个标签可供用户选择1个名称。现在我的代码每次用户只需为一个名称点击一个新标签就会创建一个新的Prototype。谢谢!我需要更新我的代码,并可能发布一个新问题。 –

+1

我包含一些额外的信息,使答案更清楚,如果您仍然有任何问题可以随意问! –

+0

啊好,所以* n *元素阵列可以在这里修复我的新问题 –