2013-12-13 2 views
5

Я пытаюсь выяснить, как использовать пользовательскую стратегию определения местоположения, я прочитал документацию на этой странице http://durandaljs.com/documentation/Using-Composition/, но я не совсем понимаю, как должна выглядеть функция стратегии.Durandal Custom View Location Strategy

Может ли кто-нибудь дать мне быстрый пример того, как будет реализована эта функция, и обещание, которое возвращается (даже простое) и т. Д.?

Спасибо заранее, Гэри

P.S. Это код в моем HTML:

<div> 
    <div data-bind="compose: {model: 'viewmodels/childRouter/first/simpleModel', strategy: 
'viewmodels/childRouter/first/myCustomViewStrategy'}"></div> </div> 

и это код в моем myCustomViewStrategy:

define(function() { 

    var myCustomViewStrategy = function() { 

     var deferred = $.Deferred(); 

     deferred.done(function() { console.log('done'); return 'simpleModelView'; }); 
     deferred.fail(function() { console.log('error'); }); 

     setTimeout(function() { deferred.resolve('done'); }, 5000); 

     return deferred.promise(); 
    }; 

return myCustomViewStrategy; 
}); 

, но я получаю сообщение об ошибке:

Uncaught TypeError: Не удается прочитать свойство 'дисплей' undefined - это после того, как сделано было зарегистрировано в окне консоли.

+0

P.S. Я бы предпочел учиться, понимая, что, если кто-то может указать мне в правильном направлении, я был бы благодарен. –

ответ

1

Хорошо я решил, создав свою пользовательскую стратегию просмотра следующим:

define(['durandal/system', 'durandal/viewEngine'], function (system, viewEngine) { 

    var myCustomViewStrategy = function() { 
     return viewEngine.createView('views/childRouter/first/sModelView'); 
    } 

    return myCustomViewStrategy; 

}); 
1

Как я нашел в документацию немного не хватает на разработке стратегии Compose связывающей х я проверил исходный код, как это работает. Для Сумм это:

Модуль, указанный при компоновке связывания восседает стратегии его moduleId

  • должен вернуть функцию с именем «Стратегия»
  • которая возвращает обещание, которое приводит к мнению, что оценка
  • как объект элемента HTML.
  • В качестве параметра метод стратегии получает объект настроек компоновки привязки
  • с уже разрешенным объектом модели.

Рабочий пример:

define(['durandal/system', 'durandal/viewEngine'], function (system, viewEngine) { 

    var strategy = function(settings){ 
     var viewid = null; 
     if(settings.model){ 
      // replaces model's module id's last segment ('/viewmodel') with '/view' 
      viewid = settings.model.__moduleId__.replace(/\/[^\/]*$/, '/view'); 
     } 
     return viewEngine.createView(viewid); 
    }; 

    return strategy; 
}); 

источник Дюрандаль в:

// composition.js:485 

for (var attrName in settings) { 
    if (ko.utils.arrayIndexOf(bindableSettings, attrName) != -1) { 
     /* 
     * strategy is unwrapped 
     */ 
     settings[attrName] = ko.utils.unwrapObservable(settings[attrName]); 
    } else { 
     settings[attrName] = settings[attrName]; 
    } 
} 

// composition.js:523 

if (system.isString(context.strategy)) { 
    /* 
    * strategy is loaded 
    */ 
    system.acquire(context.strategy).then(function (strategy) { 
     context.strategy = strategy; 
     composition.executeStrategy(context); 
    }).fail(function(err){ 
     system.error('Failed to load view strategy (' + context.strategy + '). Details: ' + err.message); 
    }); 
} else { 
    this.executeStrategy(context); 
} 

// composition.js:501 

executeStrategy: function (context) { 
    /* 
    * strategy is executed 
    * expected to be a promise 
    * which returns the view to be bound and inserted to the DOM 
    */ 
    context.strategy(context).then(function (child) { 
     composition.bindAndShow(child, context); 
    }); 
}