2012-06-06 2 views
0

Я замечаю, когда у меня есть такой код: http://jsfiddle.net/MtULf/1/Backbone.Model `defaults` вмешивается в` set`?

window.Todo = Backbone.Model.extend({ 
    defaults: { 
     "title": "" 
    }, 
    validate: function() { 
     if (this.get("title") === "") 
      return "Title is missing!"    
    } 
}); 

var todo = new Todo(); 
console.log("Expects blank: ", todo.get("title")); 

todo.set({ title: "A valid title" }); 
console.log("Expects 'A valid title': ", todo.get("title")); 

todo.set("title", ""); 
console.log("Expects blank: ", todo.get("title")); 

Все set(...), кажется, не в состоянии: todo.get("title") всегда возвращает пустую строку

Однако, если я удалить defaults, я получаю ожидаемый результат: http://jsfiddle.net/MtULf/2/

window.Todo = Backbone.Model.extend({ 
    validate: function() { 
     if (this.get("title") === "") 
      return "Title is missing!"    
    } 
}); 
+0

В этом проблема. После создания модели с помощью функции проверки достоверности. Каждый набор проверяется с использованием этой функции. ** Если вы не укажете атрибуты во время строительства **, то по умолчанию применяются автоматически. Следовательно, 'var todo = new Todo();' будет делать 'title =" "и' todo.set ({title: "Valid title"}); 'будет терпеть неудачу, потому что ваша функция validate возвращает ошибку. Все, что вам нужно сделать, это «var todo = new Todo» ({title: «A New Title»}); ' – Deeptechtons

+0

Я думаю, что потерял вас на« * и 'todo.set ({title:« Valid title »})' не будет работать, потому что ваша функция проверки возвращает ошибку * ". Почему устанавливается 'title =" Valid title "' fail? U означает, что конструктор потерпит неудачу или что-то еще? – jm2

+0

вы можете взглянуть на эту скрипку, которую я сделал для вас http://jsfiddle.net/MtULf/5/ – Deeptechtons

ответ

2

validate не получает модель, как это контекст, так что вы должны работать с атрибутами функции, то она работает, как предполагалось (за исключением Validate предотвращает титул быть установлен пустым)

http://jsfiddle.net/MtULf/3/

нет, это не правда, это .. Validate получает модель в качестве контекста, но проверяет пробеги до того, как значения заданы в модели, поэтому она всегда терпит неудачу, когда по умолчанию установлено значение «», но успешно выполняется без значения по умолчанию, так как undefined! === "".

ОК, я думаю, что получил то время ..

+0

["** validate ** вызывается перед' set' и 'save' и передается атрибуты модели обновляется со значениями из 'set' или' save'. "] (http://documentcloud.github.com/backbone/#Model-validate), так что да, у вас это получилось, +1. –

+0

О, так что я думаю, что ваша версия имеет смысл, проверка не позволит модели когда-либо входить в неправильное состояние. Однако, как вы объясните, почему в ** [версия 2] (http://jsfiddle.net/MtULf/2/) **, без 'defaults',' set ("title", "") 'будет выполнено ? – jm2

+0

Это потому, что без дефолтов проверка прошла, потому что undefined не является пустой строкой (это то, что проверяет ваш валидатор .. http://jsfiddle.net/MtULf/4/ – lecstor

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