can-model не может получить данные из файла .json

Я пытаюсь реализовать MVC, используя AMD в canjs. Для этого я использую requirejs. Это мой файл domains.json:

[            
"1":{"uid":     "1","urls": "domain1.abc.com"},
"2":{"uid":    "2","urls": "domain2.abc.com"},
"3":{"uid":    "3","urls": "domain3.abc.com"}
]

Это моя модель домена:

define(['can'], function(can){
  SearchModel= can.Model({
     id: 'uid',
     findAll: 'GET /domains.json'
  },{})
  return SearchModel;
})

Это мой контроллер:

define(['can','jquery'],function(can,$){
 domainController=can.Control({defaults:{view:"../view/search.hbs" }},           
  {
    init : function(element,options){   
        this.element.html(can.view(this.options.view,{
            searchlist : this.options.search
        }))
    }
});
return domainController;
} 

Это мой основной js:

equirejs(['can','controller/domainController','model/domainModel'],
 function(can, domainController,domainModel) {
   var Application = can.Control.extend({
    defaults :{ }
   },{  
        init: function(element,options){
         console.log('loaded');
         domainModel.findAll({}, function(domains){
            domainObject:{searchdomains : domains}
                 new domainController('#search',domainObject)
            });
        }
    })
return Application;
});

Я отслеживаю свой код. Я ставлю точки останова. В точках останова модели я не получаю значения в локальных переменных в chrome devtools.

Свойство url имеет значение «undefined/{id}», а метод findAll имеет четыре свойства, то есть аргументы, вызывающий абонент, длину и имя, имеющие значение null, null, 0 и «» соответственно.

Я проверил свой URL-адрес модели, перейдя через локальный хост в браузере, и это правильно. Тогда почему модель не может получить значения файла json?


person Dipesh Raichana    schedule 05.05.2015    source источник
comment
Помните, что имена объектов не могут начинаться с цифры, поэтому в файле domains.json измените имена с 1, 2, 3 на что-то вроде одного, двух, трех. Можно создать json с именами объектов, начинающимися с целых чисел, но когда вы попытаетесь получить доступ к этим объектам в js, это не будет работать должным образом. допустимые имена переменных JS   -  person Jacob Finamore    schedule 13.05.2015


Ответы (1)


Вы должны получить сообщение об ошибке, так как ваши данные не соответствуют тому, что Модель ожидает от findAll. Ваш JSON должен быть массивом (или, по крайней мере, иметь свойство длины):

[
  {"uid":     "1","urls": "domain1.abc.com"},
  {"uid":    "2","urls": "domain2.abc.com"},
  {"uid":    "3","urls": "domain3.abc.com"}
]

Вы также, вероятно, захотите установить для свойства id в SearchModel значение uid:

define(['can'], function(can){
  SearchModel= can.Model({
     id: 'uid',
     findAll: 'GET /domains.json'
  },{})
  return SearchModel;
})
person Daff    schedule 05.05.2015
comment
Я уже пробовал с массивом. Это не работает. Важно ли устанавливать свойство id в модели? если да, то не могли бы вы сказать мне причину. - person Dipesh Raichana; 05.05.2015
comment
Ну, ему нужно знать, что такое свойство идентификатора модели. Хотя это не должно быть проблемой. Что вы пробовали { "data": [] } в своем файле JSON? Вы видите, что он запрашивает правильный файл на вкладке сети? - person Daff; 14.05.2015
comment
Спасибо большое. Я не знал, что данные — это ключевое слово, которое нужно использовать в JSON. Я использовал другое слово. Вы, ребята, делаете большую работу. Пожалуйста, продолжайте в том же духе!! - person Dipesh Raichana; 14.05.2015
comment
На самом деле это может быть ограничением безопасности Chrome. Спасибо! И рад, что это сработало. Не стесняйтесь зайти на gitter.im/bitovi/canjs, если у вас есть дополнительные вопросы. - person Daff; 14.05.2015