javascript ember.js

javascript - Obteniendo "Unkeught TypeError: undefined no es una función" cuando intentas llamar a get() o set() desde un objeto



ember.js (1)

He estado trabajando en una plantilla de brasas que imita este tutorial de emberjs . Sin embargo, en lugar de usar el mismo objeto para las propiedades, quiero especificar el objeto "proyecto" del que proviene esta acción. Estos se almacenan en una matriz a la que se accede mediante el modelo de llamada. Cuando paso el objeto como un parámetro para la acción específica, puedo registrar el objeto y ver que está definido. Sin embargo, cuando intento establecer u obtener las propiedades, obtengo el error:

Uncaught TypeError: undefined is not a function

Puede ver los dos métodos que intenté usar para evitar el error; sin embargo, cada llamada sigue causando un error.

Método uno:

contract: function(project){ var indx = this.projects.indexOf(project) console.log(indx); this.projects[indx].set(''isExtended'', false); }

Método dos:

contract: function(project){ project.set(''isExtended'', false); }

Creo que el problema está relacionado con la matriz almacenada en el modelo o proyectos. Si alguien tiene algún consejo sobre cómo solucionar este tipo de error, házmelo saber. Gracias de antemano y aquí está todo el código relevante:

El HTML:

<script type="text/x-handlebars" id="projects"> <div class = "row bodeh"> <div class ="col-lg-12"> <h1>Projects</h1> </div> {{#each project in model}} <div {{bind-attr class=project.sass style=project.image}}> <div class="cont"> <h1><a {{bind-attr href=project.lynk}}>{{project.title}}</a></h1> <p>{{project.body}}</p> </div> {{#if project.isExtended}} <div class="extraMat"> <button type="button"{{action ''contract'' project}}>Contract</button> <p>{{project.content}}</p> </div> {{else}} <button type="button"{{action ''expand'' project}}>Expand</button> {{/if}} </div> {{/each}} </div> </script>

EmberJS

App.ProjectsRoute = Ember.Route.extend({ projects: [], actions: { expand: function(project) { console.log(this.projects.indexOf(project)); project.set(''isExtended'', true); }, contract: function(project){ var indx = this.projects.indexOf(project) console.log(indx); this.projects[indx].set(''isExtended'', false); } }, model: function() { var objects = []; //to handle the array less thing with foreach, just add index as a property. Count is also valuable. var tuna = { bgurl: "img/tunadbo.jpg", title: "Tuna", body: "Tuna is a music discovery application. But is it really? TONIGHT, we investigate. ", content: "This is the content" }; var greatest = { bgurl: "img/great.png", title: "Greatest", body: "You best believe", content: "This is the content" }; var sus = { bgurl: "img/combatix.png", title: "Combatix", body: "Small video game/n", content: "This is the content" } var trust = { bgurl: "img/great.png", title: "The Trustiest of the trust/n", body: "Ya know", content: "This is the content" } objects.pushObject(tuna); objects.pushObject(greatest); objects.pushObject(sus); objects.pushObject(trust); for(i = 0; i< objects.length; i++) { objects[i].lynk = "http://tunadbo.appspot.com"; objects[i].image = "background-image:url(''"+objects[i].bgurl+"'');"; objects[i].isExtended = true; objects[i].sass = "col-lg-12 col-sm-12 col-xs-12"; objects[i].sass += " heedthis hvr-fade"; } this.projects = objects; return objects; } });

Actualice JSBin de acuerdo con la respuesta de @ Beerlington http://emberjs.jsbin.com/davabonoto/2/edit


El error que está obteniendo es porque los objetos JavaScript simples no entienden las funciones de obtención / configuración de Ember. Hay dos formas de evitar esto.

1) Puede envolver cada literal de objeto en Ember.Object.create :

Aquí hay un ejemplo de lo que estoy hablando:

var tuna = Ember.Object.create({ bgurl: "img/tunadbo.jpg", title: "Tuna", body: "Tuna is a music discovery application. But is it really? TONIGHT, we investigate. ", content: "This is the content" });

2) Puede continuar usando literales de objetos y en su lugar usar Ember.set lugar de Ember.set sobre el objeto:

expand: function(project) { Ember.set(project, ''isExtended'', true); },