0

Я пытаюсь следовать примеру кода во второй главе книги «Создание приложений для кросс-платформ с использованием облачных сервисов Titanium, Alloy и Appcelerator» Аарона Сондерса. Я получаю сообщение об ошибке выполнения, которая выглядит как коллекция автомобилей не найден, даже если он объявлен в index.js, как показано ниже: undefined is not a functionКакова ошибка в этом коде контроллера сплава титана?

соответствующий код, я думаю, в любом в index.js или cars.js ---

//cars.js 
    // Arguments passed into this controller can be accessed via the $.args` object directly or: 
var args = $.args; 

function doClick(e) { 
    alert($.label.text); 
} 

// controllers/cars.js 
function transform(model) { 
    // Need to convert the model to a JSON object 
    var carObject = model.toJSON(); 
    return { 
     "title" : carObject.model + " by " + carObject.make, 
     "id" : model.cid 
    }; 
} 
// Show only cars made by Honda 
function filter(collection) { 
    return collection.where({ 
     make : 'Honda' 
    }); 
} 

// NOTE: I had to add the id mytable to the xml code for the cars view 
// and then change this line from $.table.add.... to get past 
// another error on this line 
$.mytable.addEventListener('click', function(_event) { 
    // get the correct model 
    var model = Alloy.Collections.cars._getByCid(_event.rowData.modelId); 
    // create the controller and pass in the model 
    var detailController = Alloy.createController('detail', { 
     data : model 
    }); 


    // get view returns the root view when no view ID is provided 
    detailController.getView().open({ 
     modal : true 
    }); 
}); 

// Free model-view data binding resources when view-controller 
// closes 
$.mainWindow.addEventListener('close', function() { 
    $.destroy(); 
}); 

и в

//index.js 
Alloy.Collections.instance("cars"); 

// I also tried adding -- 
// Alloy.Collections.cars = Alloy.createCollection('cars'); 
// to alloy.js but the error persists 

// also tried adding -- 
// Alloy.Globals.cars = Alloy.createCollection('cars'); 
// to alloy.js but still the problem persisted 

var carsController = Alloy.createController("cars"); 
Alloy.Collections.cars.reset([{ 
    "make" : "Honda", 
    "model" : "Civic" 
}, { 
    "make" : "Honda", 
    "model" : "Accord" 
}, { 
    "make" : "Ford", 
    "model" : "Escape" 
},{ 
    "make" : "Nissan", 
    "model" : "Altima" 
}]); 
//$.mainWindow.open(); 
carsController.mainWindow.open(); 

index.xml только имеет пустые теги сплава

файл cars.xml:

<Alloy> 

<Window id="mainWindow" class="container"> 
    <TableView id="mytable" dataCollection="cars" dataTransform="transform" dataFilter="filter"> 
     <TableViewRow title="{title}" modelId="{id}"></TableViewRow> 
     </TableView> 

</Window></Alloy> 

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

ответ

0

OK Я нашел github, где кто-то говорит об одном и том же коде.
https://github.com/ahuimanu/CIDM4385_Chapter03_Demo_Modified/blob/master/app/controllers/cars.js#L35
Во-первых, я был прав, чтобы добавить идентификатор к Tableview в cars.xml, но и оказывается, вызов функции я скопированный именно из книги
Alloy.Collections.cars._getByCid (_event.rowData.modelId) ;
- есть, я думаю, опечатка в том, что он не должен иметь подчеркивания в имени функции -
Alloy.Collections.cars.getByCid (_event.rowData.modelId);

Исправлено это и работает.

1

Посмотрите на http://backbonejs.org/

Удалены getByCid из коллекций. Теперь collection.get поддерживает поиск по id и cid.

+0

Спасибо, но я думаю, что сплав по-прежнему использует backbone.js версии 0.9.2, один перед удалением метода, так как я сказал, что вызов getByCid, похоже, работает сейчас. –