2014-09-30 69 views
-1

我正在尝试为中央控制器(实际上是骨干视图)定义新的属性,以使其更加划分和结构化。我尝试通过if语句在不同情况下实现我想要实现的渲染,并在这些新属性中实现每个案例的渲染。但插入替代代码后,它会使我的应用程序无法工作,从而实现该代码并评论代码。定义自定义属性并在需要时从AMD/Require.js模块加载其他模块?

我做了什么错事。

另一种我可以想象的模块化方式是再次有条件地加载不同的AMD/Require.js模型,我用单独的文件/ s加载并加载它们。但是如何?通过render()内部的require(),或者通过将新的moduleName传递给下面的define()的第二个参数。

调用 render_apprender_login
define([ 
    'jquery', 
    'ratchet', 
    'underscore', 
    'backbone', 
    'models/login', 
    'text!templates/login.html', 
    'text!templates/app.html' 

    ], function($, Ratchet, _, Backbone, LoginModel, LoginTmpl, AppTmpl){ 
     var LoginView = Backbone.View.extend({ 

      el: $("body"), 

      template_login: _.template(LoginTmpl), 
      template_app: _.template(AppTmpl), 

      initialize: function(){ 
       this.model = new LoginModel; 
       this.listenTo(this.model, 'change', this.render); 
       this.render(); 
      }, 
     //Replacement code: two attributes: 
      render_login: function(){ 
       this.$el.html(this.template_app(this.model.toJSON())); 
       console.log(JSON.stringify(this.model)); 
       return this; 
      } 
      }, 
      render_app: function(){ 
       this.$("#content").html(this.template_login(this.model.toJSON())); 
       console.log(JSON.stringify(this.model)); 
       return this; 
      }, 
      render: function() { 
      /* 
      if (this.model.get('loginp') == true) { 
      this.$el.html(this.template_app(this.model.toJSON())); 
      console.log(JSON.stringify(this.model)); 
      return this;     
      } 
      */ 

      /* 
      else { 
      this.$("#content").html(this.template_login(this.model.toJSON())); 
      console.log(JSON.stringify(this.model)); 
      return this; 
      } 
      */ 
      //Replacement code: 
      if (this.model.get('loginp') == true) { 
       this.render_app; 
      } else { 
       this.render_login; 
      } 
      }, 

      events: { 
       'click #loginbtn' : 'login', 
       'click #registerbtn' : 'register' 
      }, 

      login: function(e){ 
       e.preventDefault(); 
       var formData = {}; 

       $('input').each(function(i, el) { 
        if($(el).val() != '') { 
         if(el.id === 'username') { 
          formData[ el.id ] = $(el).val(); 
         } else if(el.id === 'password') { 
          formData[ el.id ] = $(el).val(); 
         } 
        } 
        console.log(i + ": " + $(el).val()); 
        console.log(JSON.stringify(formData)); 

        // Clear input field values 
        $(el).val(''); 
       }); 
       this.model.save(formData); 
      } 
     }); 
     return LoginView; 
}); 

回答

0

与上述回答,遗忘括号总结,

1- render_app和render_login到render_app()和render_login()

2校正的语法错误: render_login函数定义中的第二个括号。

3 - 交换render_app和render_login属性名称或其匿名函数中使用的模板。他们彼此相处'。

1

render方法的替换代码,actualy我以前不执行它们。您的忘记()

if (this.model.get('loginp') == true) { 
      this.render_app(); 
     } else { 
      this.render_login(); 
     } 
+0

但我发送的代码有语法错误。关闭渲染登录属性匿名函数应该只有一个'}'那里有两个。 再加上你的回答,还有一件事情,render_app和render_login的名字应该互换。他们的实现有彼此的模板加载。 – 2014-09-30 20:46:40

+0

在您提出问题的初始阶段,您已经提到此脚本在更改之前有效。所以我没有像'}'那样查找语法错误。你的if语句和方法的实现是你特别的问题,你应该决定选择哪一个,而不是答案编写者。因此,考虑到这一点,请纠正您的语法结尾逻辑问题,并删除您添加的答案,因为实际上它是重复我的。 – 2014-09-30 21:10:25

+0

我的答案是解决问题的方法。谢谢你的回答,但是它不足以让它工作。当然,在替换我提到的代码时,我无意中在该位置添加了一个额外的括号,并且这不是代码中的另一种问题,而是您建议的解决方案。两者都是语法问题和解决方案。而合乎逻辑的问题是另一个可以作为另一个答案的问题,但又不如你的答案和我自己的两个答案一样完整。甚至更多,你的回答在我的回答中被提及,属于不属于我的。 – 2014-09-30 21:26:11