Переносить значения из одного вида в следующий вид с использованием нокаута в структуре Jur Durandal [дубликат]

Порядок, в котором указаны взаимозависимые связанные библиотеки, неверен.

Порядок, в котором связаны библиотеки, имеет значение, если библиотеки зависят друг от друга. В общем случае, если библиотека A зависит от библиотеки B, тогда libA ДОЛЖЕН появляться перед libB в флагах компоновщика.

Например:

// B.h
#ifndef B_H
#define B_H

struct B {
    B(int);
    int x;
};

#endif

// B.cpp
#include "B.h"
B::B(int xx) : x(xx) {}

// A.h
#include "B.h"

struct A {
    A(int x);
    B b;
};

// A.cpp
#include "A.h"

A::A(int x) : b(x) {}

// main.cpp
#include "A.h"

int main() {
    A a(5);
    return 0;
};

Создайте библиотеки:

$ g++ -c A.cpp
$ g++ -c B.cpp
$ ar rvs libA.a A.o 
ar: creating libA.a
a - A.o
$ ar rvs libB.a B.o 
ar: creating libB.a
a - B.o

Скомпилируйте:

$ g++ main.cpp -L. -lB -lA
./libA.a(A.o): In function `A::A(int)':
A.cpp:(.text+0x1c): undefined reference to `B::B(int)'
collect2: error: ld returned 1 exit status
$ g++ main.cpp -L. -lA -lB
$ ./a.out

Чтобы повторить снова, порядок имеет значение!

4
задан Gildas.Tambo 10 January 2014 в 16:47
поделиться

1 ответ

Подсказка: вам, вероятно, нужен подход, ориентированный на маршрут. Другой - ради полноты.

Подход, основанный на видовом режиме. В общем, я бы сказал: создайте модуль, назовите его данными и вставьте модуль данных в оба режима просмотра. Обзор может затем установить атрибут clickedElementId в модуле данных, и детали могут прочитать значение атрибута и использовать его (вы даже можете сделать атрибут наблюдаемым, чтобы детали были уведомлены, когда атрибут изменен путем обзора). Этот подход работает, когда оба режима просмотра могут быть активны одновременно, в то время как мое следующее (предпочтительное) решение работает только в том случае, если вы переходите с одного вида на другой, поэтому они никогда не активны одновременно. Этот подход, основанный на «видимости», является тем, что я лично использую для общих данных в приложении (вы также можете использовать модель просмотра оболочки приложения для этих атрибутов).

Подход, ориентированный на маршрут. Кажется, это то, что вы хотел бы сделать, учитывая ваше описание ситуации. Определенные маршруты могут принимать (необязательные) параметры. Предположим, что теперь у вас есть параметры маршрута, вы можете изменить его на «details /: id» (принимает параметр id, необязательный) или «details (/: id)» (принимает параметр id, необязательный).

Для щелчка элемента списка вам понадобится обработчик событий:

overview.onElementClick = function (e) {
    var element = this, // The idea is that you need the clicked element for the next line of code
        koDataForElement = ko.dataFor(element);

    router.navigate('details/' + koDataForElement.id);
}

ko.dataFor - хороший помощник нокаута, чтобы получить данные viewmodel, привязанные к элементу, который вы перейдите в него, в этом случае ваш элемент списка. По щелчку вы хотите перейти к деталям и передать идентификатор элемента clicked для подробностей. Этот код делает все это.

Теперь функция активации вашей функции viewmodel должна выглядеть так:

details.activate = function (id) {
    // id is the parameter we defined for the route. Now you are free to leverage it inside your second view!
};

Изменить: дополнительный подсказку: вы также можете запускать маршрут с идентификатором непосредственно из ссылка. Предположим, что весь ваш элемент списка завернут в якорный тег, вы можете сделать что-то вроде этого:

<div data-bind="foreach: myListOfElements">
    <a href="#" data-bind="attr: { href: '#details/' + id }">listElementGoesHere</a>
</div>

Удачи! Если это еще неясно, дайте мне знать,

8
ответ дан Hans Roerdinkholder 25 August 2018 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: