2016-09-16 7 views
0

App.Models.Taskでは、validateメソッドは起動しません。JS /バックボーン - 私の単純なスクリプトはベースモデルで "validate"を発しません

TO TEST:タスクを編集し、ポップアップウィンドウでキャンセルを押します。 編集を押すと、タスクのタイトルを変更できます。 キャンセルすると、タスクのタイトルは削除されません。

ここでは、jsFiddleにここにある: https://jsfiddle.net/michaelwjoyner/x4xc7rpz/1/

(function(){ 
 

 
    window.App = { 
 
    Models:{}, 
 
    Views :{}, 
 
    Collections:{} 
 
    }; 
 

 
    window.template = function(){ 
 
    return Handlebars.compile('{{title}} <button class="edit">Edit</button> <button class="delete">Delete</button>'); 
 
    }; 
 

 
    App.Models.Task = Backbone.Model.extend({ 
 
    validate: function(attrs) { 
 
     if (! attrs.title) { 
 
     return 'A task requires a title'; 
 
     } 
 
    } 
 
    }); 
 

 

 
    App.Views.Tasks = Backbone.View.extend({ 
 
    tagName: 'ul', 
 
    render: function(){ 
 
     this.collection.each(this.addOne, this); 
 
     return this; 
 
    }, 
 
    addOne: function(task){ 
 
     // creating a new node view 
 
     var taskView = new App.Views.Task({ model : task }); 
 
     // append to the root element 
 
     this.$el.append(taskView.render().el); 
 
    } 
 
    }); 
 

 
    App.Views.Task = Backbone.View.extend({ 
 
    tagName : 'li', 
 
    events : { 
 
     'click .edit' : 'editTask' 
 
    }, 
 
    initialize : function(){ 
 
     this.model.on('change', this.render, this); 
 
    }, 
 
    editTask : function(){ 
 
     var newTask = prompt('Change task to : ',this.model.get('title')); 
 
     this.model.set('title',newTask); 
 
    }, 
 

 
    render : function() { 
 
     console.log('rendered'); 
 
     compiler = template('taskTemplate'); 
 
     html = compiler(this.model.toJSON()); 
 
     this.$el.html(html); 
 
     return this; 
 
    } 
 
    }); 
 

 
    App.Collections.Task = Backbone.Collection.extend({ 
 
    model : App.Models.Task 
 
    }); 
 

 
    var tasksCollection = new App.Collections.Task([ 
 
    { 
 
     title: 'Go to the store', 
 
     priority: 4 
 
    }, 
 
    { 
 
     title: 'Cut Hair', 
 
     priority: 4 
 
    }, 
 
    { 
 
     title: 'Go to Kingdom Hall', 
 
     priority: 4 
 
    }, 
 
    ]); 
 

 
    var tasksView = new App.Views.Tasks({collection : tasksCollection}); 
 

 
    $(document).ready(function() { 
 
    $("#tasks").html(tasksView.render().el); 
 
    }); 
 

 
})();

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script> 
    <script src="js/main.js"></script> 

    <!-- Setup our templates --> 

    <h1>Tasks</h1> 
    <div id="tasks"> 
    </div> 

</head> 
<body> 

</body> 
</html> 

答えて

0

あなたeditTask方法アドレスからキャンセルの '削除タスクのタイトル' の問題に以下の変更プロンプト。 promptここに見られるように(あなたの問題を引き起こしていた)のキャンセルにはnullを返します:

https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt)あなたは「検証する必要があります」によって何を意味するか

全くわからないが、以下のコード内のコメントには場所をお勧めします新しいタイトルを検証します。

editTask: function() { 
    var title = this.model.get('title'); 
    var newTask = prompt('Change task to : ', title); 

    if (newTask) { 
     // Run your 'validation' code here? If satisfied, set the title 

     title = newTask; 
    } 

    this.model.set('title', title); 
}, 
+0

骨格がvalidateメソッドを持つようになっている参照してください。私のApp.Models.Taskには、発火していない検証メソッドがあります。私は使用することができますビューから:this.method.validate、しかし私はそれが正しく動作するようにしたい –

0

このcode.itが動作します:)

this.model.set({ title : newTask}, { validate : true }); 
+1

詳細を編集してください。コード専用と「試してください」の回答は、検索可能なコンテンツが含まれていないため、推奨されません。なぜ誰かが「これを試してみる」べき理由を説明しません。 – abarisone

0

backbonejs docsからの利用:

チェックの保存デフォルトでは、すべての属性を設定する前に検証していますがも検証するセット伝えること{validate:true}をオプションとして渡すことで、新しい属性を追加できます。

プロンプトが表示されたら、検証するように伝えることなくモデルの値を設定します。代わりにキーを渡す

this.model.set('title',newTask); 

、値ペアまた、オブジェクトを提供することによって、属性を変更することができる:

this.model.set({'title': newTask}); 

またあなたは、例えば、設定された方法にオプションを渡すことができあなたが検証をしたいことを知らせるために:

this.model.set({'title': newTask}, {validate: true}); 

このあなたのvalidateメソッドを呼び出すと、空の値がモデルに設定されなくなります。しかし、あなたが提供したメッセージでは何もしません。あなたは、検証エラーのリスナーを提供することであることを行うことができます。

this.model.on('invalid', this.onInvalid, this); 

...

onInvalid: function() { 
    alert(this.model.validationError); 
}, 

adaptation of your code

関連する問題