2013-07-18 6 views
3

Я прочитал все темы здесь, касающиеся аргумента, но я не могу понять, что с этим кодом, это несколько часов, когда я пытаюсь понять это:Backbone.js - должно быть указано свойство или функция «url».

В нем говорится: «Неисправленная ошибка: свойство или функция« url »должны быть указаны», когда я запускаю события для сохранения и удаления из TranslationView. Я попытался выяснить другие коды, но даже добавление явно свойство URL-адрес в коллекции он не работает ... Спасибо заранее

/** 
* Translation Collection - The document 
* -- Collection of all translations in a document 
*/ 
var Document = Backbone.Collection.extend({ 
     model: Translation, 
     localStorage: new Backbone.LocalStorage("translations-db")  
    }); 
var Docs = new Document; 

/** 
* Translation View 
* -- A single language version 
* This is a version of translation 
*/ 

var TranslationView = Backbone.View.extend({ 
    template: _.template('<div class="cnt-translation"><span class="delete-btn">delete</span><span class="save-btn">save</span> Language: <input value="english" /><textarea id="translation_0" class="translation"></textarea></div>'), 

    events: { 
     'click span.delete-btn': 'remove', 
     'click span.save-btn': 'save' 
    }, 
     //'chnage ul#main-menu #add': 'addText' 

    initialize: function(){ 
     _.bindAll(this, 'render', 'unrender', 'remove','save'); 
     this.listenTo(this.model, 'destroy', this.remove); 
    }, 

    render: function(counter){ 
     this.$el.html(this.template(this.model.toJSON()));  
     return this; 
    }, 

    unrender: function(){ 
     $(this.el).remove(); 
    }, 

    remove: function(){ 
     console.log(this.model); 
     this.model.destroy(); 
    }, 

    save: function(){ 
     console.log(this.model); 
     this.model.save(); 
     console.log(localStorage); 

    } 

}); 


/** 
* Translation Main View 
* -- The Application 
* This is the top level piece of the app 
*/ 

var AppView = Backbone.View.extend({ 
    el: $('#application'), 
    type: 'localStorage', // in future also "remoteStorage" 

    events: { 
     'click #add_trans': 'createOnEnter', 
     'click #save_trans': 'saveTranslations', 
     'click #remove_trans': 'removeTranslation' 
    }, 

    initialize: function(){ 
     _.bindAll(this, 
     'render', 
     'saveTranslations', 
     'addTranslation' 
    ); 
     this.listenTo(Docs, 'add', this.addTranslation); 
     this.listenTo(Docs, 'all', this.render); 
     this.listenTo(Docs, 'reset', this.reloadAll); 
     this.render(); 
     console.log('initialized and texts loaded'); 
     Docs.fetch(); 
    }, 
    .... 

    render: function(){ 
     var self = this; 
     /* 
     _(this.collection.models).each(function(translation){ 
     self.appendTranslation(translation); 
     }, this); 
     */ 
    } 

    addTranslation: function(){ 
     console.log('addTrans called'); 
     var translation = new Translation(); 
     translation.set({ 
     id: 'translation_' + Docs.length, 
     language: 'english' // modify item defaults 
     }); 
     var translationView = new TranslationView({ model: translation }); 
     $(this.el).append(translationView.render().el); 
     console.log(Docs); 
    }, 

    createOnEnter: function(e) { 
     Docs.create({title: 'new trans'}); 
    } 


}); 


var ENTER_KEY = 13;  
var app = new AppView(); 
console.log(app); 
})(jQuery); 
+0

Это слишком много кода. Я предлагаю вам отладить его, чтобы сузить место возникновения ошибки. –

+0

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

+0

Ваша 'Backbone collection' должна иметь' url: "/ translations" '. Это не сработало для вас? – NicoSantangelo

ответ

2

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

Плагин локального хранения первого ищет localStorage собственности на модели, если она не находит это выглядит на коллекции модели для localStorage, если до сих пор нет localStorage не нашел откаты по умолчанию Backbone.Sync behaior в который нуждается в url так что вы получите исключение.

И у вас есть без посторонней помощи объекта модели, потому что вы создаете в вашем addTranslation:

var translationView = new TranslationView({ model: translation }); 

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

Вам просто нужно изменить свой метод, используя параметр translation вместо создания нового.

addTranslation: function(translation){ 
    translation.set({ 
     id: 'translation_' + Docs.length, 
     language: 'english' // modify item defaults 
    }); 

    var translationView = new TranslationView({ model: translation }); 

    $(this.el).append(translationView.render().el); 
}, 
+0

Спасибо, был именно этим! Однажды мне нужно копать глубже в источник позвоночника. Знаете ли вы какую-то статью, где подробно показано, как работает внутренняя магистраль? Я думаю, что docs не хватает немного. – LowFieldTheory

+1

@Novalink Я всегда использую аннотированный исходный код Backbone: http://backbonejs.org/docs/backbone.html – nemesv

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