какая ошибка в этом коде контроллера из титанового сплава?

Я пытаюсь следовать примеру кода из второй главы «Создание кросс-платформенных приложений с использованием облачных сервисов 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 просто содержит пустые теги Alloy

файл 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>

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


person lost baby    schedule 06.06.2016    source источник


Ответы (2)


Взгляните на http://backbonejs.org/.

getByCid удален из коллекций. collection.get теперь поддерживает поиск как по идентификатору, так и по cid.

person Michael Bahl    schedule 07.06.2016
comment
Спасибо, но я думаю, что сплав по-прежнему использует backbone.js версии 0.9.2, до того, как этот метод был удален, как я уже сказал, вызов getByCid теперь работает. - person lost baby; 07.06.2016

Хорошо, я нашел 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);

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

person lost baby    schedule 07.06.2016