2013-06-06 3 views
0

У меня возникли проблемы с доступом к свойствам простого объекта.JavaScript: невозможно получить доступ к объектам

Это то, что я получаю, когда я бегу alert(JSON.stringify(user)):

{"username": "david", "biography": "Hello world."} 

Но это то, что я получаю, когда я бегу alert(user.username):

undefined 

Я также попытался user["username"] с тем же результатом. Это происходит в контексте приложения Backbone с использованием Handlebars. Ниже приведена базовая часть:

var User = Backbone.Model.extend({ 
    urlRoot: 'http://api.example.com/user', 
}); 

var Router = Backbone.Router.extend({ 
    routes: { 
    ":username": "profile" 
    }, 
    profile: function (username) { 
    var user = new User({id: username}); 
    user.fetch({ 
     beforeSend: authenticate, 
     success: function() { 
     var profile = new Profile({user: user}); 
     profile.render(); 
     } 
    }); 
    } 
}); 

var Profile = Backbone.View.extend({ 
    render: function() { 
    var source = $("#profile").html(); 
    var template = Handlebars.compile(source); 
    user = this.options.user; 
    var html = template(user); 
    $("#content section").html(html); 
    } 
}); 

Что может быть причиной такой проблемы?

+0

Как вы узнаете о пользователях? Вы уверены, что это объект, а не строка? – Antoine

+0

- это базовая модель? Я спрашиваю их, потому что вы добавили тег на свой вопрос. –

+0

Да, код в моем сообщении находится в представлении, в которое передается объект 'user'. Я запускал 'alert (typeof user)' и возвращает 'object'. Я добавлю еще несколько вопросов к вопросу. –

ответ

3

, если объект пользователя является основой модели, то попробуйте это

console.log(user.get('username')); 
or 
cosole.log(user.attributes.username); 
+1

Да, это сработало. Я просто передал '{имя пользователя: user.get (« имя пользователя »), биографию: user.get (« биография »)}' в функцию шаблона Handlebars, и он отлично работал. Благодаря! –

1

Это работает для меня

var user = {"username": "david", "biography": "Hello world."}; 
alert (user.username); 
alert (user["username"]); 
+1

Да, обычно это сработает. Я считаю, что моя проблема имеет какое-то отношение к контексту базовой линии ... –

+0

Я понимаю. Можете ли вы, пожалуйста, обновить вопрос и включить дополнительную информацию, чтобы мы могли помочь – SharpCoder

1

JSON.stringify будет искать функцию toJSON и использовать возвращаемое значение что он использует JSON.

Магистраль, вероятно, делает некоторые причудливые кодировки, чтобы упростить использование своих объектов модели. Поскольку они не думают, что вы хотите, чтобы все мусорщики вставляли, они предоставили вам чистый результат toJSON().

@Rayweb_on имеет остальную часть ответа.

+0

Спасибо, что научили меня не всегда доверять JSON.stringify :-) –

Смежные вопросы