backbone.js无法在脚本中找到错误

时间:2014-07-09 13:08:43

标签: javascript jquery css backbone.js

我是javascript和backbone.js的新手 我想创建一个简单的网页,其中包含10个方格,其形式将采用方形ID和颜色。

因此每个广场必须在CSS中拥有自己的风格。

我尝试用10个模板制作它。但是脚本根本不起作用。

这是我的代码:

alert("script entry");

$(function () {


blocks = [
            {number: "1", state: "block1" },
            {number: "2", state: "block2" },
            {number: "3", state: "block3" },
            {number: "4", state: "block4" },
            {number: "5", state: "block5" },
            {number: "6", state: "block6" },
            {number: "7", state: "block7" },
            {number: "8", state: "block8" },
            {number: "9", state: "block9" },
            {number: "10", state: "block10" },
];

var BlockModel = Backbone.Model.extend({ 
    defaults:{
        "state": "block1",
        "number": "1"
    }
});
var BlockCollection = Backbone.Collection.extend({ 
    model: BlockModel,
});
var blockNumbers = new BlockCollection([  
           model:BlockModel
            ]);

var BlockView = Backbone.View.extend({
    tagName: "blockTag",
    className: "blockClass",
    templates: { 
        "block1": _.template($('#block1').html()),
        "block2": _.template($('#block2').html()),
        "block3": _.template($('#block3').html()),
        "block4": _.template($('#block4').html()),
        "block5": _.template($('#block5').html()),
        "block6": _.template($('#block6').html()),
        "block7": _.template($('#block7').html()),
        "block8": _.template($('#block8').html()),
        "block9": _.template($('#block9').html()),
        "block10": _.template($('#block10').html())
    },

    render: function () {
        var state= this.model.get("state");  
        var tmpl = this.templates(state); 
        $(this.el).html(tmpl(this.model.toJSON())); 
        return this;
    }
});



var appView = Backbone.View.extend({
    el: $("#block"), //большой контейнер

    initialize: function(){
        this.collection = new blockNumbers(blocks);
        this.render();
    },

    render: function(){ 

         _.each(this.collection.models, function () {
            that.renderBlock(this.model);
        }, this);
    },

     renderBlock: function (inputModel) {
        var blockView = new BlockView({
            {model: inputModel}
        });
        this.$el.append(blockView.render().el);
    }


}); 

var app = new appView();


});

我的错误在哪里? 我的index.html

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>TEST</title>
   <link rel="stylesheet" type="text/css" href="style.css">



</head>
 <body>

    <div id="block"> 



<script type="text/template" id="block1">
  <div class="block1"><%=number%></div>
  <div class="buttonplace">
        <input type="button" value="check" />
  </div>
</script>

<script type="text/template" id="block2">
   <div class="block2"><%=number%></div>
</script>

<script type="text/template" id="block3">
  <div class="block3">3</div>
</script>

<script type="text/template" id="block4">
  <div class="block4">4</div>
</script>

<script type="text/template" id="block5">
  <div class="block5">5</div>
</script>

<script type="text/template" id="block6">
  <div class="block6">6</div>
</script>

<script type="text/template" id="block7">
  <div class="block7">7</div>
</script>

<script type="text/template" id="block8">
  <div class="block8">8</div>
</script>

<script type="text/template" id="block9">
  <div class="block9">9</div>
</script>

<script type="text/template" id="block10">
  <div class="block10">10</div>

</script>


</div>


<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="underscore.js"></script>
<script type="text/javascript" src="backbone.js"></script>

<script type="text/javascript" src="script.js"></script>



</body>
</html>

2 个答案:

答案 0 :(得分:1)

您的代码存在一些问题,主要是您在某些情况下使用括号而不是括号[而不是花括号{。你还有一些额外的尾随逗号。此外,在您的HTML中, div的结束标记应该在所有脚本模板之前。

例如

var blockNumbers = new BlockCollection([  
           model:BlockModel
            ]);

应该是

var blockNumbers = new BlockCollection({  
           model:BlockModel
       });

var tmpl = this.templates(state); 

应该是

 var tmpl = this.templates[state]; 

此外,在appView中,您正尝试实例化实例的新实例

this.collection = new blockNumbers(blocks);

虽然你可能想要做

this.collection = new BlockNumbers(blocks);

这是一个有效的jsBin

除了您对模板进行大量重复之外,您可以将它们全部合并到一个或两个模板中。

例如,您可以只使用一个带有按钮的块的模板和一个没有按钮的块的模板,并相应地更新块状态

  <script type="text/template" id="blockWithButton">
  <div class="block<%=number%>"><%=number%></div>
  <div class="buttonplace">
        <input type="button" value="check" />
  </div>
  </script>

  <script type="text/template" id="blockWithoutButton">
  <div class="block<%=number%>"><%=number%></div>
  </script>

另一个jsbin

答案 1 :(得分:0)

templates: { 
    "block1": _.template($('#block1').html()),
    ...         
    "block10": _.template($('#block10').html())
},

您已经定义了上面的对象。

var tmpl = this.templates(state);

但你把它称为一个功能。

您可以将模板设为this.templates[state];

<强>更新

我认为您可以使用相同的模板:

<script type="text/template" id="block">
    <div class="block<%=number%>"><%=number%></div>
    <div class="buttonplace">
        <input type="button" value="check" />
  </div>
</script>

你也可以像这样简化你的模型。

当然,如果你需要。

<强>更新

您可以new一个包含单个{}但不包含[]或更多{}个选项的收藏集,如下所示:

var blockNumbers = new BlockCollection({  
    model:BlockModel
});

...

var blockView = new BlockView({
   model: inputModel
});

var blockNumbers = new BlockCollection([  
    model:BlockModel
]);

...

var blockView = new BlockView({
   {model: inputModel}
});

<强>更新

blockNumbers是Collection的一个实例,您无法通过new获取数据,如:

this.collection = new blockNumbers(blocks);

您应该将bolckNumbers分配给this.collection,并为其指定网址,然后拨打sync()fetch()以获取数据,然后进行呈现。

<强> END

最后,我发现上面的基础错误太多, Backbone.js 很简单但很难,你应该能够自己解决它,它对你有用。

感谢。