如何在ember中获取组件的值?

时间:2015-02-02 22:59:35

标签: javascript ember.js ember-cli bing-maps

如何从组件内的夹具调用属性值?我正在尝试设置坐标以在bing maps api中放置一个引脚。我想从夹具中获取坐标。我该怎么做?

我正在用ember-cli构建一个应用程序,所以如果与emberjs有任何重要的区别来解决问题,请告诉我。

HERE是jsBin

这是html:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Ember Starter Kit</title>
  <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.1/normalize.css">
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
  <script src="http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v2.0.0.js"></script>
  <script src="http://builds.emberjs.com/tags/v1.9.1/ember.js"></script>
      <script charset="UTF-8" type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script>
</head>
<body>

  <script type="text/x-handlebars">
    <h2>Welcome to Ember.js</h2>

    {{outlet}}
  </script>

  <script type="text/x-handlebars" data-template-name="index">
    {{bing-map height=590}}
  </script>


</body>
</html>

这是JavaScript:

App = Ember.Application.create();

App.Router.map(function() {
  // put your routes here
});

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return App.COORD;
  }
});

App.COORD=[
  {
    id:1,
    latitude: 34.05,
    longitude: -118.25,
  },
  {
    id:2,
    latitude: 25.77,
    longitude: -80.19,
  },
  {
    id:3,
    latitude: 28.53,
    longitude: -81.37,
  }
];

App.BingMapComponent = Ember.Component.extend({
  attributeBindings: ['style'],
  classNames: ['bing-map'],
  bingKey: "AkmMkZ5YpX8xsXHY4uBxD8Gz2S5f3GkTRebOw0t4voyb7gFryc0ElW4toY3cJbTt",
  width: '45%',
  height: '100%',
  latitude: 0,
  longitude: 0,
  latitudePin:undefined,
  longitudePin:undefined,
  zoom: 1,
  mapTypeId: 'r', // r:road, a:aerial



  setPin: function(){
    Liens.forEach(function(lien){
        if(lien.setLocation){
            this.get('latitude').push(lien.latitude);
            this.get('longitude').push(lien.longitude);
            console.log('this is happening');
        }
    });
  },

  init: function(){
    this._super();
    if (!this.get('bingKey')){
      throw('Missing bingKey');
    }
    this.api = Microsoft.Maps;
    this.map = null;
  },

  style: function(){
    return "position: relative; width: %@px; height: %@px".fmt(
      this.get('width'),
      this.get('height')
    );
  }.property('width', 'height'),

  center: function(){
    var latitude  = parseFloat(this.get('latitude'));
    var longitude = parseFloat(this.get('longitude'));
    longitude = this.api.Location.normalizeLongitude(longitude);

    return new this.api.Location(latitude, longitude);
  }.property('latitude', 'longitude'),

  mapOptions: function(){
    return {
      center:      this.get('center'),
      zoom:        parseInt(this.get('zoom'),10),
      mapTypeId:   this.get('mapTypeId')
    };
  }.property('center','zoom','mapTypeId'),

  createMap: function(){
    var el = this.$()[0];
    var options = this.get('mapOptions');
    options.credentials = this.get('bingKey');
    this.map = new Microsoft.Maps.Map(el, options);

    var latitude = this.get('latitudePin');
    var longitude = this.get('longitudePin');



    var pin = new Microsoft.Maps.Pushpin(new Microsoft.Maps.Location(31,-118));
    this.map.entities.push(pin);




    // var pin1 = new Microsoft.Maps.Pushpin(new Microsoft.Maps.Location(this.get('latitude'), this.get('longitude')));
    // Microsoft.Maps.Events.addHandler(pin1, 'click');



    // var pin2 = new Microsoft.Maps.Pushpin(new Microsoft.Maps.Location(0, -30));
    // pin2.Title = "This is Pin 2";
    // pin2.Description = "Pin 2 description";
    // Microsoft.Maps.Events.addHandler(pin2, 'click');
    // this.map.entities.push(pin2);


 //    var latitude;
 //    var longitude;
    // var loc = new Microsoft.Maps.Location(latitude, longitude);
    // var pushpin = new Microsoft.Maps.Pushpin(loc); 
    // this.map.entities.push(pushpin);


  }.on('didInsertElement'),

    removeMap: function(){
      this.map.dispose();
    }.on('willDestroyElement'),

});

提前致谢。解决此问题所需的任何其他细节请询问,我会尽快回复

1 个答案:

答案 0 :(得分:2)

您可以按如下方式将model传递给您的组件:

<script type="text/x-handlebars" data-template-name="index">
  {{bing-map height=590 pins=model}}
</script>

然后,在您的组件中pins成为组件的属性,因此您可以按如下方式获取坐标:

var pins = this.get('pins');
pins.forEach(function(pin, index){
  console.log(index + 1 + " " + pin.latitude);
});

工作演示here