3

I have a App.js like this,

App = Ember.Application.create();

App.Model = Ember.Object.extend({

});

App.IndexRoute = Ember.Route.extend({
    redirect : function() {
        this.transitionTo('users');
    }
});

App.UsersController = Ember.ObjectController.extend({

        filteredContent : function() {
            var searchText = this.get('searchText'), regex = new RegExp(searchText, 'i');

            return this.get('model').filter(function(item) {
                return regex.test(item.name);
            });
        }.property('searchText', 'model')

});

App.User = App.Model.extend({
    id : null,
    firstname : null,
    email : null
});

App.UsersRoute = Ember.Route.extend({
    model : function() {
        return App.User.findAll();
    }
});

App.UserRoute = Ember.Route.extend({
    model : function(params) {
      //var everyone = this.controllerFor('users');
      return App.User.findBy('id', params.user_id);
    }
});


App.User.reopenClass({
    findAll : function() {
        return $.getJSON("http://pioneerdev.us/users/index", function(data) {
            return data.map(function(row) {
                return App.User.create(row);
            });
        });
    }
});


App.Router.map(function() {
    this.resource('users', function() {
        this.resource('user',{path: '/:user_id'});
    });
});

HTML,

<script type="text/x-handlebars" data-template-name="users">

            {{input type="text" value=searchText}}

            {{#each item in filteredContent }}
            <tr><td>
              {{#link-to 'user' item}} <p>{{item.firstname}}</p>{{/link-to}}
            </td></tr>
            {{/each}}

            {{outlet}}
        </script>


     <script type="text/x-handlebars" data-template-name="user">
    <h2>
        {{email}}
   </h2>

    </script>

and I am getting a error like this on Chrome,

Uncaught TypeError: Object #<Object> has no method 'map' 

and Firefox gives me, TypeError: data.map is not a function

Here's the Sample of JSON,

{"users":[{"id":"1","firstname":"Marilyn","lastname":"Hughes","address":"4 Johnson Alley","state":"Utah","country":"US","email":"lfreeman@skyvu.info","phone":"6471228888","experience":"5","designation":"Writer"},{"id":"2","firstname":"John","lastname":"Porter","address":"86228 Commercial Court","state":"Pennsylvania","country":"US","email":"jporter@zoomdog.net","phone":"9018889877","experience":"3","designation":"Design"},{"id":"3","firstname":"Frances","lastname":"Johnson","address":"489 Summit Lane","state":"Minnesota","country":"US","email":"fjohnson@teklist.net","phone":null,"experience":"2","designation":"Script"}]}

What might be the issue? I am pretty sure it's an issue with .getJSON.

Should I use data.users.map instead of data.map? But when I use this, I get error on this line,

return this.get('model').filter(function(item) {

saying,

Uncaught TypeError: Object #<Object> has no method 'filter'


Yes you need to use data.users.map, because you are expectiong an array of elements, in the model property from controller.

The Uncaught TypeError: Object #<Object> has no method 'filter' error is because, this.get('model') have the data no data.users. So Object class don't have a method called filter, just Array. That data is returned from $.getJSON().then() method that resolve with the data:

$.getJSON().then(function(data) {
  // something like this is made by ember
  // controller.set('model', data);
});

And you need data.users as ember objects.

So I update your code to the following:

App.User.reopenClass({
    findAll : function() {
        return new Ember.RSVP.Promise(function(resolve, reject) {
            $.getJSON("http://pioneerdev.us/users/index", function(data) {
                var result = data.users.map(function(row) {
                    return App.User.create(row);
                });
                // here we resolve the array with ember objects
                // so you will have this.get('model') filled with array of users
                resolve(result);
            }).fail(reject);
        });
    }
});

It is a good idea to use the RSVP.Promise because this is the promises api used by ember.

This is the fiddle showing this working http://jsfiddle.net/marciojunior/HtJEh/

4

1 回答 1

3

是的,您需要data.users.map在控制器的模型属性中使用 ,因为您期望一个元素数组。

Uncaught TypeError: Object #<Object> has no method 'filter'错误是 因为,this.get('model')没有。所以类没有一个叫做过滤器的方法,只有. 该数据是从使用数据解析的方法返回的:datadata.usersObjectArray$.getJSON().then()

$.getJSON().then(function(data) {
  // something like this is made by ember
  // controller.set('model', data);
});

你需要 data.users 作为 ember 对象。

所以我将您的代码更新为以下内容:

App.User.reopenClass({
    findAll : function() {
        return new Ember.RSVP.Promise(function(resolve, reject) {
            $.getJSON("http://pioneerdev.us/users/index", function(data) {
                var result = data.users.map(function(row) {
                    return App.User.create(row);
                });
                // here we resolve the array with ember objects
                // so you will have this.get('model') filled with array of users
                resolve(result);
            }).fail(reject);
        });
    }
});

使用 是个好主意,RSVP.Promise因为这是 ember 使用的 promises api。

这是显示此工作的小提琴http://jsfiddle.net/marciojunior/HtJEh/

于 2013-09-09T00:50:10.410 回答