javascript - 主干中的动态加载模板和对象之间的通信

标签 javascript jquery backbone.js

我面临解决问题的问题,需要编写重复代码,但我不希望这样。
所以我想如何解决这个问题作为美丽的编程方面。

我想到了一些解决方案。
1.父对象添加事件绑定(bind)到路由器
例如,用户访问 example.com/#aaa 、 example.com/#bbb 时 我加载路由器主题标签而不是处理该事件。
如果用户访问#aaa,则加载模板aaa。

但我找到了很多引用资料,但我不知道如何实现该解决方案,即在backbone.js上进行父子对象通信

<强>2。父对象添加功能
我认为解决方案是访问 url 存储在路由器中的目标
例如,如果我访问 example.com/#aaa 那么 router 会被写入 target = aaa 然后父对象加载函数并渲染异步ajax加载模板并抛出结果子对象。

但同样我也没有能力实现这一点。

谁来给我指点一下?

许多backbone.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;
      }
    });

我不需要重复代码。 View .Home = templateName = 'home'; ~~
情况 = tamplateName = '情况'; ~~

如何解决?

最佳答案

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;
      }
    });

我解决了该问题,使用ajax调用subUrl使用函数参数并抛出子对象,然后子对象呈现此模板字符串。

关于javascript - 主干中的动态加载模板和对象之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533209/

相关文章:

javascript - Backbone.js + 模态窗口 - 是什么导致它在 IE9 上中断?

javascript - chrome 扩展无法使用内容脚本和其他方式从谷歌加载外部 javascript

php - 使用 base64 预加载图像

javascript - html内容的json解析错误

javascript - 更改 Owl Carousel 侧面后如何获取ID

javascript - Facebook 登录仅显示按钮

重命名 asp.net 页面后 JavaScript 不工作

javascript - 如何在iframe中显示来自div标签的所有超链接

javascript - 主干 - 根据条件更改 tagName

javascript - Backbone UI 模型与 Handlebars 绑定(bind)