2013-02-15 3 views
5

Emberjs v1.0.0-pre.4 में सेट डेटा के साथ टेम्पलेट रेंडर करने में असमर्थsetupController

Handlebars 1.0.0.rc.2

मैं एंबर में एक फेसबुक दोस्त सूची प्रबंधक का निर्माण कर रहा हूँ। जब मैं list/1/members पर नेविगेट करता हूं तो सदस्य जो सदस्य सदस्य नियंत्रक को पॉप्युलेट करता है, वह प्रदर्शित नहीं होता है।

सदस्य मार्ग मित्र टेम्पलेट प्रस्तुत करेगा, जो आम तौर पर हमारे सभी दोस्तों को प्रदर्शित करता है, लेकिन इस परिदृश्य में केवल चयनित सूची के सदस्य हैं।

आवेदन के रूटर

App.Router.map(function() { 
    this.route('instructions'); 
    this.route('friends'); 
    this.route('members', {path: '/list/:list_id/members'}); 
}); 

मार्ग

App.MembersRoute = Ember.Route.extend({ 
    model: function() { 
     var list = this.controllerFor('application').get('selectedList'), 
      friends = list && list.get('members') || []; 
     return friends; 
    }, 
    setupController: function (controller, model) { 
     var list = this.controllerFor('application').get('selectedList'); 
     controller.set('title', list.get('title')); 
     controller.set('list', list); 
     controller.set('content', model); 
    }, 
    renderTemplate: function() { 
     this.render('friends'); 
    } 
}); 

मित्र टेम्पलेट

<script type='text/x-handlebars' data-template-name='friends'> 
    <h2>{{title}}</h2> 
    <ul id='friends'> 
    {{#each friend in controller}} 
     <a href='#' {{action 'select' friend}}> 
     <li {{bindAttr class='friend.isSelected:selected'}}> 
      <img {{bindAttr src='friend.imageUrl'}}/> 
      <p>{{friend.name}}</p> 
     </li> 
     </a> 
    {{else}} 
     <h3>There are no friends in this list.</h3> 
    {{/each}} 
    </ul> 
</script> 

आवेदन टेम्पलेट

<script type='text/x-handlebars' data-template-name='application'> 
     <div class='row'> 
      <div class='span4'> 
       {{render 'lists'}} 
      </div> 
      <div class='span8> 
       {{outlet}} 
      </div> 
     </div> 
</script> 

अन्त में, डेटा संग्रह और मॉडल

App.Store = DS.Store.extend({ 
    revision: 11, 
    adapter: 'DS.FixtureAdapter' 
}); 

App.List = DS.Model.extend({ 
    members: DS.hasMany('App.Friend'), 
    name: DS.attr('string'), 
    isSelected: DS.attr('boolean'), 
    num_of_members: function() { 
     var num = this.get('members').toArray().length, 
     str = num + ' Member'; 
     return num === 1 ? str : str + 's'; 
    }.property('members'), 
    title: function() { 
     return 'Friends in ' + this.get('name'); 
    }.property('name'), 
    toggleSelected: function() { 
     this.set('isSelected', !this.get('isSelected')); 
     return this; 
    } 
}); 

App.Friend = DS.Model.extend({ 
    lists: DS.hasMany('App.List'), 
    name: DS.attr('string'), 
    imageUrl: DS.attr('string'), 
    isSelected: DS.attr('boolean'), 
    toggleSelected: function() { 
     this.set('isSelected', !this.get('isSelected')); 
     return this; 
    } 
}); 

उत्तर

1

सुनिश्चित नहीं हैं कि अगर यह मदद करता है, लेकिन ऐसा लगता है model पर ध्यान नहीं दिया है या जब setupController परिभाषित किया गया है खो दिया है लग रहा है। मुझे नहीं पता कि यह एम्बरजेएस के साथ एक बग है या नहीं।

setupController: function(controller) { 
    controller.set('something', 'some value'); 
    controller.set('model', this.modelFor('todos')); // this was originally in the model function 
} 

या और भी बेहतर:

model: function() { 
    return this.modelFor('todos'); 
} 

तक बढ़ाया जा सकता है:

setupController: function(controller, model) { 
    controller.set('something', 'some value'); 
    controller.set('model', model); // this was originally in the model function 
} 
2

वास्तव में आप सिर्फ _super का उपयोग करना चाहिए

मेरे वैकल्पिक हल मॉडल सीधे सेट करने के लिए है डिफ़ॉल्ट कार्यान्वयन को लागू करने के लिए।

setupController: function(controller, model) { 
    this._super(controller, model) 
    controller.set('something', 'some value'); 
}