2017-01-08 11 views
0

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

Я подумал о некотором решении.
1. родительский объект добавить привязку событий к маршрутизатору
, например, пользователь при посещении example.com/#aaa, example.com/#bbb я загрузить маршрутизатор хэштегом, чем обрабатывать это событие.
если пользователь посещает #aaa, то загрузите шаблон aaa.

, но я нашел много ссылок, но я не знаю, как реализовать это решение, которое является родителем и дочерний объект связи в Backbone.js

2. родительский объект добавить функцию
я думал решение, что посещение url хранит цель в маршрутизаторе
например, если я посещаю example.com/#aaa, тогда маршрутизатор записывается target = aaa , тогда родительский объект загружает функцию и обрабатывает шаблон загрузки async ajax и бросает результирующий дочерний объект.

но аналогичным образом у меня нет абляции, это есть.

кто подскажет мне?

много ссылок на бэкбон.js плохо и трудно.

router.js (мой источник)

var app = app || {}; 
(function() { 
    'use strict'; 
    var views = app.view = app.view || {}; 

    app.Router = Backbone.Router.extend({ 
     initialize: function(){ 
      this.bind("all", this.change) 
      console.log(this.change); 
     }, 
     routes: { 
      'situation': 'situationRoute', 
      'video': 'videoRoute', 
      'culture': 'cultureRoute', 
      //와일드카드 디폴트 라우터는 맨 마지막에 삽입. 
      '*home': 'homeRoute' 
     }, 
     _bindRoutes: function() { 
      if (!this.routes) return; 
      this.routes = _.result(this, 'routes'); 
      var route, routes = _.keys(this.routes); 
      while ((route = routes.pop()) != null) { 
      this.route(route, this.routes[route]); 
      } 
     }, 
     initialize: function() { 
      // create the layout once here 
      this.layout = new views.Application({ 
       el: 'body', 
      }); 
     }, 
     homeRoute: function() { 
      var view = new views.Home(); 
      var target = 'Home'; 
      this.layout.renderSubpage(target); 
      this.layout.setContent(view); 
     }, 
     situationRoute: function() { 
      var view = new views.Situation(); 
      var target = 'Situation'; 
      this.layout.setContent(view); 
     }, 
     videoRoute: function() { 
      var view = new views.Video(); 
      var target = 'Video'; 
      this.layout.setContent(view); 
     }, 
     cultureRoute: function(){ 
      var view = new views.Culture(); 
      var target = 'Culture'; 
      this.layout.setContent(view); 
     } 
     }); 
     var router = new app.Router(); 
     Backbone.history.start(); 
})(); 

view.js (мой источник)

var app = app || {}; 
(function() { 
    'use strict'; 
    //views linitalize 
    var views = app.view = app.view || {}; 
    views.Application = Backbone.View.extend({ 
     initialize: function() { 
      this.$content = this.$('#container'); 
      //this.$loading = this.$('#loading'); 
     }, 
     setContent: function(view, target) { 
      var content = this.content; 
      this.renderSubpage(); 
      if (content) content.remove(); 
      content = this.content = view; 
      this.$content.html(content.render().el); 
     }, 
     showSpinner: function() { 
      this.$loading.show(); 
     }, 
     hideSpinner: function() { 
      this.$loading.hide(); 
     }, 
     renderSubpage: function(target){ 
      var target = target; 
      var templateName = target; 
      var tmpl_dir = '../assets/static'; 
      var tmpl_url = tmpl_dir + '/' + templateName + '.html'; 
      var tmpl_string = ''; 

      $.ajax({ 
       url: tmpl_url, 
       method: 'GET', 
       async: false, 
       dataType : html, 
       success: function (data) { 
        tmpl_string = data; 
       } 
      }); 

      var template = _.template(tmpl_string); 
      this.$el.html(template); 

      return this; 
     } 
    }); 
    views.Home = Backbone.View.extend({ 
     render: function(html) { 
     return this; 
     //how to get return result? in parent object? 
     } 
    }); 
    views.Stuation = Backbone.View.extend({ 
     render: function() { 
     var template = _.template("<strong><% print('Hello ' + page); %></strong>"); 
     var pageTxt = {page: "About"}; 
     var html = template(pageTxt); 
     this.$el.html(html); 
     return this; 
     } 
    }); 
    views.Video = Backbone.View.extend({ 
     render: function() { 
     var template = _.template("<strong><% print('Hello ' + page); %></strong>"); 
     var pageTxt = {page: "Contact"}; 
     var html = template(pageTxt); 
     this.$el.html(html); 
     return this; 
     } 
    }); 
    views.Culture = Backbone.View.extend({ 
     render: function() { 
     var template = _.template("<strong><% print('Hello ' + page); %></strong>"); 
     var pageTxt = {page: "Contact"}; 
     var html = template(pageTxt); 
     this.$el.html(html); 
     return this; 
     } 
    }); 
})(); 

renderSubpage: функция (цель) первоначально под источником.

views.Home = Backbone.View.extend({ 
     render: function(html) { 
     var templateName = home; 
     var tmpl_dir = '../assets/static'; 
     var tmpl_url = tmpl_dir + '/' + templateName + '.html'; 
     var tmpl_string = ''; 

     $.ajax({ 
      url: tmpl_url, 
      method: 'GET', 
      async: false, 
      dataType : html, 
      success: function (data) { 
       tmpl_string = data; 
      } 
     }); 

     var template = _.template(tmpl_string); 
     this.$el.html(template); 

     return this; 
     } 
    }); 

Я не хочу код repitation. views.Home = templateName = 'home'; ~~
views.Situation = tamplateName = 'Situation'; ~~

Как это исправить?

ответ

0
var app = app || {}; 
(function() { 
    'use strict'; 
    //views linitalize 
    var views = app.view = app.view || {}; 
    views.Application = Backbone.View.extend({ 
     initialize: function() { 
      this.$content = this.$('#container'); 
      //this.$loading = this.$('#loading'); 
     }, 
     setContent: function(view, target) { 
      var content = this.content; 
      var subUrl = this.target; 

      if (content) content.remove(); 
      //if (content || target) content.remove()target.remove(); 

      content = this.content = view; 
      subUrl = this.target = target; 

      var templateName = subUrl; 
      var tmpl_dir = '../assets/static'; 
      var tmpl_url = tmpl_dir + '/' + templateName + '.html'; 
      var tmpl_string = ''; 

      $.ajax({ 
       url: tmpl_url, 
       method: 'GET', 
       async: false, 
       dataType : 'html', 
       success: function (data) { 
        tmpl_string = data; 
       } 
      }); 
      console.log(tmpl_string); 
      this.$content.html(content.render(tmpl_string).el); 
     }, 
     showSpinner: function() { 
      this.$loading.show(); 
     }, 
     hideSpinner: function() { 
      this.$loading.hide(); 
     } 
    }); 
    views.Home = Backbone.View.extend({ 
     render: function(templateName) { 
     var template = _.template(templateName); 
     this.$el.html(template); 
     return this; 
     } 
    }); 

я решить этот параметр использовать ploblem функцию с помощью AJAX subUrl вызова и бросить дочерний объект, то дочерний объект делает этот шаблон строки.

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

  • Нет связанных вопросов^_^